Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/build.xml
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/build.xml	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/build.xml	(revision 28050)
@@ -60,5 +60,5 @@
     <target name="compile" depends="init">
         <echo message="compiling sources for ${module.jar} ... "/>
-        <javac srcdir="${module.src.dir}" debug="true" destdir="${module.build.dir}" includeAntRuntime="false">
+        <javac srcdir="${module.src.dir}" debug="true" destdir="${module.build.dir}" includeAntRuntime="false" encoding="UTF-8" >
             <classpath>
                 <pathelement location="${josm}"/>
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/DataGouvDataSetHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/DataGouvDataSetHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/DataGouvDataSetHandler.java	(revision 28050)
@@ -16,4 +16,5 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets;
 
+import java.net.MalformedURLException;
 import java.net.URL;
 
@@ -66,3 +67,24 @@
 		return null;
 	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#getLicenseURL()
+	 */
+	@Override
+	public URL getLicenseURL() {
+		try {
+			return new URL(FRENCH_PORTAL+"Licence-Ouverte-Open-Licence");
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	protected final void setDataGouvFrUrl(String suffix) {
+		try {
+			setDataURL(FRENCH_PORTAL+"var/download/"+suffix);
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
+	}
 }
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/administration/GeoFlaHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/administration/GeoFlaHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/administration/GeoFlaHandler.java	(revision 28050)
@@ -18,4 +18,6 @@
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.lang3.text.WordUtils;
@@ -28,4 +30,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.DataGouvDataSetHandler;
+import org.openstreetmap.josm.tools.Pair;
 
 public class GeoFlaHandler extends DataGouvDataSetHandler {
@@ -33,4 +36,5 @@
 	public GeoFlaHandler() {
 		super();
+		setName("GEOFLA®");
 	}
 
@@ -201,3 +205,29 @@
 		return null;
 	}
+	
+	private Pair<String, URL> getGeoflaURL(String name, String urlSuffix) throws MalformedURLException {
+		return new Pair<String, URL>(name, new URL("http://professionnels.ign.fr/DISPLAY/000/"+urlSuffix));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#getDataURLs()
+	 */
+	@Override
+	public List<Pair<String, URL>> getDataURLs() {
+		List<Pair<String, URL>> result = new ArrayList<Pair<String,URL>>();
+		try {
+			result.add(getGeoflaURL("Départements France métropolitaine et Corse", "528/175/5281750/GEOFLADept_FR_Corse_AV_L93.zip"));
+			result.add(getGeoflaURL("Départements France entière",                 "528/175/5281754/FR_DOM_Mayotte_shp_WGS84.zip"));
+			// FIXME: tar.gz files
+			/*result.add(getGeoflaURL("Communes France métropolitaine", "531/266/5312664/GEOFLA_1-1_SHP_LAMB93_FR-ED111.tar.gz"));
+			result.add(getGeoflaURL("Communes Guadeloupe",            "531/265/5312650/GEOFLA_1-1_SHP_UTM20W84_GP-ED111.tar.gz"));
+			result.add(getGeoflaURL("Communes Martinique",            "531/265/5312653/GEOFLA_1-1_SHP_UTM20W84_MQ-ED111.tar.gz"));
+			result.add(getGeoflaURL("Communes Guyane",                "531/265/5312657/GEOFLA_1-1_SHP_UTM22RGFG95_GF-ED111.tar.gz"));
+			result.add(getGeoflaURL("Communes Réunion",               "531/266/5312660/GEOFLA_1-1_SHP_RGR92UTM40S_RE-ED111.tar.gz"));
+			result.add(getGeoflaURL("Communes Mayotte",               "531/275/5312753/GEOFLA_1-1_SHP_RGM04UTM38S_YT-ED111.tar.gz"));*/
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
 }
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/agriculture/RegistreParcellaireHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/agriculture/RegistreParcellaireHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/agriculture/RegistreParcellaireHandler.java	(revision 28050)
@@ -16,8 +16,15 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.agriculture;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
+import org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDepartment;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.DataGouvDataSetHandler;
+import org.openstreetmap.josm.tools.Pair;
 
 public class RegistreParcellaireHandler extends DataGouvDataSetHandler {
@@ -55,4 +62,5 @@
 	public RegistreParcellaireHandler() {
 		super();
+		setName("Registre Parcellaire Graphique");
 	}
 
@@ -124,3 +132,23 @@
 		}
 	}
+
+	private Pair<String, URL> getRpgURL(String number, String name) throws MalformedURLException {
+		return new Pair<String, URL>(number+" - "+name, new URL("http://www.data.gouv.fr/var/download/ign/RPG_2010_"+number+".ZIP"));
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#getDataURLs()
+	 */
+	@Override
+	public List<Pair<String, URL>> getDataURLs() {
+		List<Pair<String, URL>> result = new ArrayList<Pair<String,URL>>();
+		try {
+			for (FrenchDepartment dpt : FrenchDepartment.allDepartments) {
+				result.add(getRpgURL(dpt.getCode(), dpt.getName()));
+			}
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
 }
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/culture/BibliothequesHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/culture/BibliothequesHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/culture/BibliothequesHandler.java	(revision 28050)
@@ -19,4 +19,5 @@
 
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.DataGouvDataSetHandler;
 
@@ -25,4 +26,6 @@
 	public BibliothequesHandler() {
 		super("Adresses-des-bibliothèques-municipales-30382179", lambert93);
+		setName("Bibliothèques municipales");
+		setDataGouvFrUrl("lieux de lecture_geoloc.txt");
 	}
 
@@ -34,6 +37,7 @@
 	@Override
 	public void updateDataSet(DataSet ds) {
-		// TODO Auto-generated method stub
-		
+		for (Node n : ds.getNodes()) {
+			n.put("amenity", "library");
+		}
 	}
 
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/diplomatie/EtabAEFEHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/diplomatie/EtabAEFEHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/diplomatie/EtabAEFEHandler.java	(revision 28050)
@@ -24,9 +24,11 @@
 	public EtabAEFEHandler() {
 		super("Géolocalisation-des-établissements-du-réseau-d'enseignement-de-l'AEFE-30382449", wgs84);
+		setName("Établissements du réseau d'enseignement de l'AEFE");
+		setDataGouvFrUrl("ETALAB_MAEE_Extraction_LDAP_geoloc_AEFE_2011-10-13.csv");
 	}
 
 	@Override
 	public boolean acceptsFilename(String filename) {
-		return acceptsCsvFilename(filename, "ETALAB_MAEE_Extraction_LDAP_geoloc_AEFE_20..-..-..\\.csv-fr");
+		return acceptsCsvFilename(filename, "ETALAB_MAEE_Extraction_LDAP_geoloc_AEFE_20..-..-..(\\.csv-fr)?");
 	}
 
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/ecologie/AssainissementHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/ecologie/AssainissementHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/ecologie/AssainissementHandler.java	(revision 28050)
@@ -16,6 +16,12 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.ecologie;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.DataGouvDataSetHandler;
+import org.openstreetmap.josm.tools.Pair;
 
 public class AssainissementHandler extends DataGouvDataSetHandler {
@@ -23,4 +29,5 @@
 	public AssainissementHandler() {
 		super("assainissement-collectif-30381843");
+		setName("Assainissement collectif");
 	}
 
@@ -42,3 +49,19 @@
 		return 1;
 	}
+
+	/* (non-Javadoc)
+	 * @see org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler#getDataURLs()
+	 */
+	@Override
+	public List<Pair<String, URL>> getDataURLs() {
+		List<Pair<String, URL>> result = new ArrayList<Pair<String,URL>>();
+		try {
+			result.add(new Pair<String, URL>("Données 2009", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2.php")));
+			// FIXME problem with 2010 file (blank cells ?)
+			//result.add(new Pair<String, URL>("Données 2010", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2010.php")));
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
 }
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/education/Etab1er2ndDegreHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/education/Etab1er2ndDegreHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/education/Etab1er2ndDegreHandler.java	(revision 28050)
@@ -28,9 +28,11 @@
 	public Etab1er2ndDegreHandler() {
 		super("Géolocalisation-des-établissements-d'enseignement-du-premier-degré-et-du-second-degré-du-ministère-d-30378093");
+		setName("Établissements d'enseignement du premier degré et du second degré");
+		setDataGouvFrUrl("MENJVA_etab_geoloc.csv");
 	}
 	
 	@Override
 	public boolean acceptsFilename(String filename) {
-		return acceptsCsvFilename(filename, "MENJVA_etab_geoloc.csv-fr");
+		return acceptsCsvFilename(filename, "MENJVA_etab_geoloc(\\.csv-fr)?");
 	}
 
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/education/EtabSupHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/education/EtabSupHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/education/EtabSupHandler.java	(revision 28050)
@@ -26,9 +26,11 @@
 	public EtabSupHandler() {
 		super("Etablissements-d'enseignement-supérieur-30382046", wgs84);
+		setName("Établissements d'enseignement supérieur");
+		setDataGouvFrUrl("livraison ETALAB 28 11 2011.xls");
 	}
 
 	@Override
 	public boolean acceptsFilename(String filename) {
-		return acceptsXlsFilename(filename, "livraison ETALAB .. .. 20..\\.xls-fr");
+		return acceptsXlsFilename(filename, "livraison ETALAB .. .. 20..(\\.xls-fr)?");
 	}
 
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/hydrologie/ROEHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/hydrologie/ROEHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/hydrologie/ROEHandler.java	(revision 28050)
@@ -16,4 +16,6 @@
 package org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.hydrologie;
 
+import java.net.MalformedURLException;
+
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -24,4 +26,10 @@
 	public ROEHandler() {
 		super("référentiel-des-obstacles-à-l'écoulement-30381987");
+		setName("Référentiel des Obstacles à l’Écoulement");
+		try {
+			setDataURL("http://www.eaufrance.fr/docs/ROE/donnee_obstacles_ecoulement_v3.zip");
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		}
 	}
 
Index: applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/transport/PassageNiveauHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/transport/PassageNiveauHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/modules/fr.datagouvfr/src/org/openstreetmap/josm/plugins/opendata/modules/fr/datagouvfr/datasets/transport/PassageNiveauHandler.java	(revision 28050)
@@ -26,9 +26,11 @@
 	public PassageNiveauHandler() {
 		super("Passages-à-niveau-30383135");
+		setName("Passages à niveau");
+		setDataGouvFrUrl("passage_a_niveau.csv");
 	}
 
 	@Override
 	public boolean acceptsFilename(String filename) {
-		return acceptsCsvFilename(filename, "passage_a_niveau.csv-fr");
+		return acceptsCsvFilename(filename, "passage_a_niveau(\\.csv-fr)?");
 	}
 
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java	(revision 28050)
@@ -19,6 +19,8 @@
 import static org.openstreetmap.josm.tools.I18n.marktr;
 
+import java.awt.Toolkit;
 import java.awt.event.KeyEvent;
 import java.io.File;
+import java.net.URL;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -27,4 +29,5 @@
 
 import javax.swing.JMenu;
+import javax.swing.JMenuItem;
 
 import org.openstreetmap.josm.Main;
@@ -32,4 +35,5 @@
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.MenuScroller;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -55,4 +59,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation;
+import org.openstreetmap.josm.tools.Pair;
 
 public final class OdPlugin extends Plugin implements OdConstants {
@@ -93,17 +98,23 @@
 	}
 	
+	private JMenu getModuleMenu(Module module) {
+		String moduleName = module.getDisplayedName();
+		if (moduleName == null || moduleName.isEmpty()) {
+			moduleName = module.getModuleInformation().getName();
+		}
+		JMenu moduleMenu = new JMenu(moduleName);
+		moduleMenu.setIcon(module.getModuleInformation().getScaledIcon());
+		return moduleMenu;
+	}
+	
 	private void buildMenu() {
+        int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
         for (Module module : ModuleHandler.moduleList) {
         	Map<DataSetCategory, JMenu> catMenus = new HashMap<DataSetCategory, JMenu>();
         	JMenu moduleMenu = null;
         	for (AbstractDataSetHandler handler: module.getHandlers()) {
-        		if (handler.getDataURL() != null) {
+        		if (handler.getDataURL() != null || (handler.getDataURLs() != null && !handler.getDataURLs().isEmpty())) {
         			if (moduleMenu == null) {
-        				String moduleName = module.getDisplayedName();
-        				if (moduleName == null || moduleName.isEmpty()) {
-        					moduleName = module.getModuleInformation().getName();
-        				}
-        				moduleMenu = new JMenu(moduleName);
-        				moduleMenu.setIcon(module.getModuleInformation().getScaledIcon());
+        				moduleMenu = getModuleMenu(module);
         			}
         			DataSetCategory cat = handler.getCategory();
@@ -118,13 +129,33 @@
         				endMenu = moduleMenu;
         			}
-        			endMenu.add(new DownloadDataAction(handler));
+        			String handlerName = handler.getName();
+        			if (handlerName == null || handlerName.isEmpty()) {
+        				handlerName = handler.getClass().getName();
+        			}
+        			if (handler.getDataURL() != null) {
+        				endMenu.add(new DownloadDataAction(handlerName, handler.getDataURL()));
+        			} else if (handler.getDataURLs() != null) {
+        				JMenu handlerMenu = new JMenu(handlerName);
+        				JMenuItem item = null;
+        				for (Pair<String, URL> pair : handler.getDataURLs()) {
+        					if (pair != null && pair.a != null && pair.b != null) {
+        						item = handlerMenu.add(new DownloadDataAction(pair.a, pair.b));
+        					}
+        				}
+        				if (item != null) {
+        					MenuScroller.setScrollerFor(handlerMenu, (screenHeight / item.getPreferredSize().height)-3);
+        					endMenu.add(handlerMenu);
+        				}
+        			}
         		}
         	}
         	if (moduleMenu != null) {
+        		//MenuScroller.setScrollerFor(moduleMenu, screenHeight / moduleMenu.getItem(0).getPreferredSize().height);
         		menu.add(moduleMenu);
         	}
         }
         menu.addSeparator();
-        MainMenu.add(menu, new OpenPreferencesActions());
+        /*JMenuItem itemIcon =*/ MainMenu.add(menu, new OpenPreferencesActions());
+        //MenuScroller.setScrollerFor(menu, screenHeight / itemIcon.getPreferredSize().height);
 	}
 
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 28050)
@@ -126,5 +126,5 @@
     public static final String Y_STRING = "Y|LAT|LATI|LATITUDE|NORTHING";
     
-    // The list of all ProjectionPatterns (filled at each constrcutor call)
+    // The list of all ProjectionPatterns (filled at each constructor call)
     public static final Collection<ProjectionPatterns> PROJECTIONS = new ArrayList<ProjectionPatterns>();
     
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataAction.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataAction.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataAction.java	(revision 28050)
@@ -17,4 +17,5 @@
 
 import java.awt.event.ActionEvent;
+import java.net.URL;
 
 import javax.swing.Action;
@@ -22,24 +23,22 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 public class DownloadDataAction extends JosmAction {
 
-	private final AbstractDataSetHandler handler;
+	private final URL url;
 	
-	public DownloadDataAction(AbstractDataSetHandler handler) {
-		CheckParameterUtil.ensureParameterNotNull(handler, "handler");
-		this.handler = handler;
-		String name = handler.getName();
-		if (name == null || name.isEmpty()) {
-			name = handler.getClass().getName();
-		}
+	public DownloadDataAction(String name, URL url) {
+		super(false);
+		CheckParameterUtil.ensureParameterNotNull(name, "name");
+		CheckParameterUtil.ensureParameterNotNull(url, "url");
 		putValue(Action.NAME, name);
+		putValue("toolbar", "opendata_download_"+name.toLowerCase().replace(" ", "_"));
+		this.url = url;
 	}
 	
 	@Override
 	public void actionPerformed(ActionEvent e) {
-		Main.main.menu.openLocation.openUrl(true, handler.getDataURL().toString());
+		Main.main.menu.openLocation.openUrl(true, url.toString());
 	}
 }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java	(revision 28050)
@@ -56,5 +56,5 @@
 		for (Module module : ModuleHandler.moduleList) {
 			for (AbstractDataSetHandler handler : module.getHandlers()) {
-				if (handler != null && handler.getDataURL() != null && url.equals(handler.getDataURL().toString())) {
+				if (handler.acceptsUrl(url)) {
 					this.handler = handler;
 					return true;
@@ -77,6 +77,13 @@
 		protected OsmDataLayer createNewLayer(String layerName) {
             File associatedFile = ((NetworkReader)reader).getReadFile();
+            String filename = ((NetworkReader)reader).getReadFileName();
             if (layerName == null || layerName.isEmpty()) {
-                layerName = associatedFile == null ? OsmDataLayer.createNewName() : associatedFile.getName();
+            	if (associatedFile != null) {
+            		layerName = associatedFile.getName();
+            	} else if (filename != null && !filename.isEmpty()) {
+            		layerName = filename;
+            	} else {
+            		layerName = OsmDataLayer.createNewName();
+            	}
             }
     		DataSetUpdater.updateDataSet(dataSet, handler, associatedFile);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenPreferencesActions.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenPreferencesActions.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenPreferencesActions.java	(revision 28050)
@@ -30,6 +30,8 @@
 	
     public OpenPreferencesActions() {
+    	super(false);
         putValue(NAME, tr("Preferences"));
         putValue(SMALL_ICON, ImageProvider.get("dialogs", ICON_CORE_24));
+		putValue("toolbar", "opendata_open_preferences");
     }
     
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 28050)
@@ -17,4 +17,5 @@
 
 import java.io.File;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.nio.charset.Charset;
@@ -97,4 +98,5 @@
 	private String sourceDate;
 	private File associatedFile;
+	private URL dataURL;
 
 	public AbstractDataSetHandler() {
@@ -179,6 +181,16 @@
 	public URL getLicenseURL() {return null;}
 
-	public URL getDataURL() {return null;}
-	
+	public URL getDataURL() {return dataURL;}
+	
+	public final void setDataURL(String url) throws MalformedURLException {
+		this.dataURL = new URL(url);
+	}
+	
+	public final void setDataURL(URL url) {
+		this.dataURL = url;
+	}
+
+	public List<Pair<String,URL>> getDataURLs() {return null;}
+
 	public AbstractReader getReaderForUrl(String url) {return null;}
 
@@ -522,3 +534,17 @@
 		return false;
 	}
+	
+	public boolean acceptsUrl(String url) {
+		if (getDataURL() != null && url.equals(getDataURL().toString())) {
+			return true;
+		}
+		if (getDataURLs() != null) {
+			for (Pair<String, URL> pair : getDataURLs()) {
+				if (pair.b != null && url.equals(pair.b.toString())) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchConstants.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchConstants.java	(revision 28050)
@@ -23,5 +23,5 @@
 	 * Portal
 	 */
-	public static final String FRENCH_PORTAL = "http://www.data.gouv.fr/donnees/view/";
+	public static final String FRENCH_PORTAL = "http://www.data.gouv.fr/";
 	
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java	(revision 28050)
@@ -98,5 +98,5 @@
 		try {
 			if (nationalPortalPath != null && !nationalPortalPath.isEmpty()) {
-				return new URL(FRENCH_PORTAL + nationalPortalPath);
+				return new URL(FRENCH_PORTAL + "donnees/view/" + nationalPortalPath);
 			}
 		} catch (MalformedURLException e) {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDepartment.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDepartment.java	(revision 28050)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDepartment.java	(revision 28050)
@@ -0,0 +1,138 @@
+//    JOSM opendata plugin.
+//    Copyright (C) 2011-2012 Don-vip
+//
+//    This program is free software: you can redistribute it and/or modify
+//    it under the terms of the GNU General Public License as published by
+//    the Free Software Foundation, either version 3 of the License, or
+//    (at your option) any later version.
+//
+//    This program is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//    GNU General Public License for more details.
+//
+//    You should have received a copy of the GNU General Public License
+//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+package org.openstreetmap.josm.plugins.opendata.core.datasets.fr;
+
+public final class FrenchDepartment {
+	private final String code; 
+	private final String name;
+	
+	private FrenchDepartment(String code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+
+	public final String getCode() {
+		return code;
+	}
+
+	public final String getName() {
+		return name;
+	}
+
+	public static final FrenchDepartment[] allDepartments = new FrenchDepartment[] {
+		new FrenchDepartment("001", "Ain"),
+		new FrenchDepartment("002", "Aisne"),
+		new FrenchDepartment("003", "Allier"),
+		new FrenchDepartment("004", "Alpes-de-Haute-Provence"),
+		new FrenchDepartment("005", "Hautes-Alpes"),
+		new FrenchDepartment("006", "Alpes-Maritimes"),
+		new FrenchDepartment("007", "Ardèche"),
+		new FrenchDepartment("008", "Ardennes"),
+		new FrenchDepartment("009", "Ariège"),
+		new FrenchDepartment("010", "Aube"),
+		new FrenchDepartment("011", "Aude"),
+		new FrenchDepartment("012", "Aveyron"),
+		new FrenchDepartment("013", "Bouches-du-Rhône"),
+		new FrenchDepartment("014", "Calvados"),
+		new FrenchDepartment("015", "Cantal"),
+		new FrenchDepartment("016", "Charente"),
+		new FrenchDepartment("017", "Charente-Maritime"),
+		new FrenchDepartment("018", "Cher"),
+		new FrenchDepartment("019", "Corrèze"),
+		new FrenchDepartment("02A", "Corse-du-Sud"),
+		new FrenchDepartment("02B", "Haute-Corse"),
+		new FrenchDepartment("021", "Côte-d'Or"),
+		new FrenchDepartment("022", "Côtes-d'Armor"),
+		new FrenchDepartment("023", "Creuse"),
+		new FrenchDepartment("024", "Dordogne"),
+		new FrenchDepartment("025", "Doubs"),
+		new FrenchDepartment("026", "Drôme"),
+		new FrenchDepartment("027", "Eure"),
+		new FrenchDepartment("028", "Eure-et-Loir"),
+		new FrenchDepartment("029", "Finistère"),
+		new FrenchDepartment("030", "Gard"),
+		new FrenchDepartment("031", "Haute-Garonne"),
+		new FrenchDepartment("032", "Gers"),
+		new FrenchDepartment("033", "Gironde"),
+		new FrenchDepartment("034", "Hérault"),
+		new FrenchDepartment("035", "Ille-et-Vilaine"),
+		new FrenchDepartment("036", "Indre"),
+		new FrenchDepartment("037", "Indre-et-Loire"),
+		new FrenchDepartment("038", "Isère"),
+		new FrenchDepartment("039", "Jura"),
+		new FrenchDepartment("040", "Landes"),
+		new FrenchDepartment("041", "Loir-et-Cher"),
+		new FrenchDepartment("042", "Loire"),
+		new FrenchDepartment("043", "Haute-Loire"),
+		new FrenchDepartment("044", "Loire-Atlantique"),
+		new FrenchDepartment("045", "Loiret"),
+		new FrenchDepartment("046", "Lot"),
+		new FrenchDepartment("047", "Lot-et-Garonne"),
+		new FrenchDepartment("048", "Lozère"),
+		new FrenchDepartment("049", "Maine-et-Loire"),
+		new FrenchDepartment("050", "Manche"),
+		new FrenchDepartment("051", "Marne"),
+		new FrenchDepartment("052", "Haute-Marne"),
+		new FrenchDepartment("053", "Mayenne"),
+		new FrenchDepartment("054", "Meurthe-et-Moselle"),
+		new FrenchDepartment("055", "Meuse"),
+		new FrenchDepartment("056", "Morbihan"),
+		new FrenchDepartment("057", "Moselle"),
+		new FrenchDepartment("058", "Nièvre"),
+		new FrenchDepartment("059", "Nord"),
+		new FrenchDepartment("060", "Oise"),
+		new FrenchDepartment("061", "Orne"),
+		new FrenchDepartment("062", "Pas-de-Calais"),
+		new FrenchDepartment("063", "Puy-de-Dôme"),
+		new FrenchDepartment("064", "Pyrénées-Atlantiques"),
+		new FrenchDepartment("065", "Hautes-Pyrénées"),
+		new FrenchDepartment("066", "Pyrénées-Orientales"),
+		new FrenchDepartment("067", "Bas-Rhin"),
+		new FrenchDepartment("068", "Haut-Rhin"),
+		new FrenchDepartment("069", "Rhône"),
+		new FrenchDepartment("070", "Haute-Saône"),
+		new FrenchDepartment("071", "Saône-et-Loire"),
+		new FrenchDepartment("072", "Sarthe"),
+		new FrenchDepartment("073", "Savoie"),
+		new FrenchDepartment("074", "Haute-Savoie"),
+		new FrenchDepartment("075", "Paris"),
+		new FrenchDepartment("076", "Seine-Maritime"),
+		new FrenchDepartment("077", "Seine-et-Marne"),
+		new FrenchDepartment("078", "Yvelines"),
+		new FrenchDepartment("079", "Deux-Sèvres"),
+		new FrenchDepartment("080", "Somme"),
+		new FrenchDepartment("081", "Tarn"),
+		new FrenchDepartment("082", "Tarn-et-Garonne"),
+		new FrenchDepartment("083", "Var"),
+		new FrenchDepartment("084", "Vaucluse"),
+		new FrenchDepartment("085", "Vendée"),
+		new FrenchDepartment("086", "Vienne"),
+		new FrenchDepartment("087", "Haute-Vienne"),
+		new FrenchDepartment("088", "Vosges"),
+		new FrenchDepartment("089", "Yonne"),
+		new FrenchDepartment("090", "Territoire de Belfort"),
+		new FrenchDepartment("091", "Essonne"),
+		new FrenchDepartment("092", "Hauts-de-Seine"),
+		new FrenchDepartment("093", "Seine-Saint-Denis"),
+		new FrenchDepartment("094", "Val-de-Marne"),
+		new FrenchDepartment("095", "Val-d'Oise"),
+		new FrenchDepartment("971", "Guadeloupe"),
+		new FrenchDepartment("972", "Martinique"),
+		new FrenchDepartment("973", "Guyane"),
+		new FrenchDepartment("974", "La Réunion"),
+		new FrenchDepartment("976", "Mayotte"),
+	};
+}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java	(revision 28050)
@@ -20,4 +20,6 @@
 import java.io.File;
 import java.io.InputStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -26,4 +28,5 @@
 import org.openstreetmap.josm.io.OsmServerReader;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.archive.ZipReader;
@@ -38,5 +41,5 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class NetworkReader extends OsmServerReader {
+public class NetworkReader extends OsmServerReader implements OdConstants {
 
 	private final String url;
@@ -45,4 +48,5 @@
 
 	private File file;
+	private String filename;
 	
     public NetworkReader(String url, AbstractDataSetHandler handler, Class<? extends AbstractReader> readerClass) {
@@ -58,4 +62,62 @@
 	}
 
+	public final String getReadFileName() {
+		return filename;
+	}
+
+	private Class<? extends AbstractReader> findReaderByAttachment() {
+		String cdisp = this.activeConnection.getHeaderField("Content-disposition");
+		if (cdisp != null) {
+			Matcher m = Pattern.compile("attachment; filename=(.*)").matcher(cdisp);
+			if (m.matches()) {
+				filename = m.group(1);
+				return findReaderByExtension(filename.toLowerCase());
+			}
+		}
+		return null;
+	}
+
+	private Class<? extends AbstractReader> findReaderByContentType() {
+    	String contentType = this.activeConnection.getContentType();
+    	if (contentType.startsWith("application/zip")) {
+    		return ZipReader.class;
+    	} else if (contentType.startsWith("application/vnd.ms-excel")) {
+    		return XlsReader.class;
+    	} else if (contentType.startsWith("application/octet-stream")) {
+        	//return OdsReader.class;//FIXME, can be anything
+    	} else if (contentType.startsWith("text/plain")) {//TODO: extract charset
+    		return CsvReader.class;
+    	} else if (contentType.startsWith("tdyn/html")) {
+        	//return CsvReader.class;//FIXME, can also be .tar.gz
+    	} else {
+    		System.err.println("Unsupported content type: "+contentType);
+    	}
+    	return null;
+	}
+
+	private Class<? extends AbstractReader> findReaderByExtension(String filename) {
+    	if (filename.endsWith("."+XLS_EXT)) {
+    		return XlsReader.class;
+    	} else if (filename.endsWith("."+CSV_EXT)) {
+    		return CsvReader.class;
+    	} else if (filename.endsWith("."+ODS_EXT)) {
+    		return OdsReader.class;
+    	} else if (filename.endsWith("."+KML_EXT)) {
+    		return KmlReader.class;
+    	} else if (filename.endsWith("."+KMZ_EXT)) {
+    		return KmzReader.class;
+    	} else if (filename.endsWith("."+MIF_EXT)) {
+    		return MifReader.class;
+    	} else if (filename.endsWith("."+SHP_EXT)) {
+    		return ShpReader.class;
+    	} else if (filename.endsWith("."+TAB_EXT)) {
+    		return TabReader.class;
+    	} else if (filename.endsWith("."+ZIP_EXT)) {
+    		return ZipReader.class;
+    	} else {
+    		return null;
+    	}
+	}
+
 	@Override
 	public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
@@ -69,10 +131,17 @@
             ProgressMonitor instance = progressMonitor.createSubTaskMonitor(1, false);
             if (readerClass == null) {
-            	String contentType = this.activeConnection.getContentType();
-            	if (contentType.startsWith("application/zip")) {
-            		readerClass = ZipReader.class;
-            	} else {
-            		throw new IllegalArgumentException("Unsupported content type: "+contentType);
+            	readerClass = findReaderByAttachment();
+            }
+            if (readerClass == null) {
+            	readerClass = findReaderByContentType();
+            }
+            if (readerClass == null) {
+            	readerClass = findReaderByExtension(url.toLowerCase());
+            	if (readerClass != null) {
+            		filename = url.substring(url.lastIndexOf('/'));
             	}
+            }
+            if (readerClass == null) {
+           		throw new OsmTransferException("Cannot find appropriate reader !");//TODO handler job ?
             }
             if (readerClass.equals(ZipReader.class)) {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 28050)
@@ -63,5 +63,9 @@
 
 	public static final Pattern getCoordinatePattern(String coor, String proj) {
-    	return Pattern.compile("(?:.*(?:"+coor+").*(?:"+proj+").*)|(?:.*("+proj+").*(?:"+coor+").*)", Pattern.CASE_INSENSITIVE);
+		if (proj != null && !proj.isEmpty()) {
+			return Pattern.compile("(?:.*(?:"+coor+").*(?:"+proj+").*)|(?:.*("+proj+").*(?:"+coor+").*)", Pattern.CASE_INSENSITIVE);
+		} else {
+			return Pattern.compile(coor, Pattern.CASE_INSENSITIVE);
+		}
     }
 }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java	(revision 28046)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java	(revision 28050)
@@ -96,4 +96,8 @@
 			while ((entry = zis.getNextEntry()) != null) {
 				File file = new File(temp + File.separator + entry.getName());
+		    	File parent = file.getParentFile();
+		    	if (parent != null && !parent.exists()) {
+		    		parent.mkdirs();
+		    	}
 			    if (file.exists() && !file.delete()) {
 			        throw new IOException("Could not delete temp file/dir: " + file.getAbsolutePath());
