Index: applications/editors/josm/plugins/opendata/modules/fr.toulouse/build.xml
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.toulouse/build.xml	(revision 28554)
+++ applications/editors/josm/plugins/opendata/modules/fr.toulouse/build.xml	(revision 28696)
@@ -30,4 +30,5 @@
     <property name="plugin.dist.dir" value="../../../../dist"/>
     <property name="opendata" location="${plugin.dist.dir}/opendata.jar"/>
+    <property name="utilsplugin2" location="${plugin.dist.dir}/utilsplugin2.jar"/>
     <property name="module.build.dir" value="build"/>
     <property name="module.src.dir" value="src"/>
@@ -64,4 +65,5 @@
                 <pathelement location="${josm}"/>
                 <pathelement location="${opendata}"/>
+            	<pathelement location="${utilsplugin2}"/>
             </classpath>
             <compilerarg value="-Xlint:deprecation"/>
Index: applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java	(revision 28554)
+++ applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java	(revision 28696)
@@ -16,6 +16,17 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse;
 
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.TreeSet;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.plugins.opendata.core.io.NetworkReader;
 import org.openstreetmap.josm.plugins.opendata.core.modules.AbstractModule;
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation;
+import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.associations.Club3eAgeHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.BureauxVoteHandler;
@@ -102,3 +113,56 @@
         handlers.add(InstallationSportiveToulouseHandler.class);
     }
+    
+    public static final DataSet data = new DataSet();
+    
+    private static final Collection<Relation> getBoundaries(int admin_level) {
+        Collection<Relation> result = new TreeSet<Relation>(new Comparator<Relation>() {
+            @Override
+            public int compare(Relation o1, Relation o2) {
+                return o1.get("ref").compareTo(o2.get("ref"));
+            }
+        });
+        synchronized (data) {
+            for (Relation r : data.getRelations()) {
+                if (r.hasTag("admin_level", Integer.toString(admin_level)) && 
+                        (r.hasKey("name") || r.hasKey("ref") || r.hasKey("description"))) {
+                    result.add(r);
+                }
+            }
+        }
+        return result;
+    }
+    
+    public static final void downloadData() {
+        synchronized (data) {
+            if (data.allPrimitives().isEmpty()) {
+                for (final ToulouseDataSetHandler handler : new ToulouseDataSetHandler[]{
+                        new SecteursHandler(), new QuartiersHandler()}) {
+                    Main.worker.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                DataSet ds = new NetworkReader(handler.getDataURL().toString(), handler, false).
+                                        parseOsm(NullProgressMonitor.INSTANCE);
+                                handler.updateDataSet(ds);
+                                synchronized (data) {
+                                    data.mergeFrom(ds);
+                                }
+                            } catch (OsmTransferException e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    });
+                }
+            }
+        }
+    }
+    
+    public static final Collection<Relation> getSectors() {
+        return getBoundaries(10);
+    }
+
+    public static final Collection<Relation> getNeighbourhoods() {
+        return getBoundaries(11);
+    }
 }
Index: applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/ToulouseDataSetHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/ToulouseDataSetHandler.java	(revision 28554)
+++ applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/ToulouseDataSetHandler.java	(revision 28696)
@@ -16,10 +16,36 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
 import java.net.MalformedURLException;
-
+import java.util.Collection;
+import java.util.Collections;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
+import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
+import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
+import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.plugins.opendata.OdPlugin;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDataSetHandler;
+import org.openstreetmap.josm.plugins.opendata.core.layers.OdDataLayer;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.ToulouseConstants;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.ToulouseLicense;
+import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.ToulouseModule;
+import org.openstreetmap.josm.plugins.utilsplugin2.selection.NodeWayUtils;
 
 public abstract class ToulouseDataSetHandler extends FrenchDataSetHandler implements ToulouseConstants {
@@ -66,4 +92,6 @@
                 setDataURL(url+"/resource/document");
             }
+            addTool(new SplitBySector());
+            addTool(new SplitByNeighbourhood());
         } catch (MalformedURLException e) {
             e.printStackTrace();
@@ -105,3 +133,83 @@
         }
     }
+    
+    protected abstract class SplitAction extends JosmAction implements DataSetListener {
+        
+        public SplitAction(String name, String desc) {
+            super(name, null, desc, null, false);
+            setEnabled(false);
+            ToulouseModule.data.addDataSetListener(this);
+        }
+        
+        protected abstract Collection<Relation> getBoundaries();
+        
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            final String baseName = OdPlugin.getInstance().getDialog().getDataLayer().getName();
+            final DataSet baseDs = getCurrentDataSet();
+            for (OsmPrimitive boundary : getBoundaries()) {
+                DataSet data = new DataSet();
+                for (OsmPrimitive p : NodeWayUtils.selectAllInside(Collections.singleton(boundary), baseDs)) {
+                    if (p instanceof Node) {
+                        data.addPrimitive(new Node((Node)p));
+                    } else if (p instanceof Way) {
+                        data.addPrimitive(new Way((Way)p));
+                    } else if (p instanceof Relation) {
+                        data.addPrimitive(new Relation((Relation)p));
+                    }
+                }
+                Main.main.addLayer(new OdDataLayer(data, baseName+"/"+boundary.get("ref"), null, ToulouseDataSetHandler.this));
+            }
+        }
+        @Override
+        public void dataChanged(DataChangedEvent event) {
+            setEnabled(!getBoundaries().isEmpty());
+        }
+        @Override
+        public void primitivesAdded(PrimitivesAddedEvent event) {
+        }
+        @Override
+        public void primitivesRemoved(PrimitivesRemovedEvent event) {
+        }
+        @Override
+        public void tagsChanged(TagsChangedEvent event) {
+        }
+        @Override
+        public void nodeMoved(NodeMovedEvent event) {
+        }
+        @Override
+        public void wayNodesChanged(WayNodesChangedEvent event) {
+        }
+        @Override
+        public void relationMembersChanged(RelationMembersChangedEvent event) {
+        }
+        @Override
+        public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+        }
+    }
+    
+    protected class SplitBySector extends SplitAction {
+        public SplitBySector() {
+            super(marktr("Split by sector"), tr("Split this data by sector (admin_level=10)."));
+        }
+        @Override
+        protected Collection<Relation> getBoundaries() {
+            return ToulouseModule.getSectors();
+        }
+    }
+
+    protected class SplitByNeighbourhood extends SplitAction {
+        public SplitByNeighbourhood() {
+            super(marktr("Split by neighbourhood"), tr("Split this data by neighbourhood (admin_level=11)."));
+        }
+        @Override
+        protected Collection<Relation> getBoundaries() {
+            return ToulouseModule.getNeighbourhoods();
+        }
+    }
+
+    @Override
+    public void notifyActive() {
+        ToulouseModule.downloadData();
+    }
 }
