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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java	(revision 30563)
@@ -22,5 +22,4 @@
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.actions.DownloadDataAction;
 import org.openstreetmap.josm.plugins.opendata.core.actions.DownloadDataTask;
@@ -47,5 +46,5 @@
 import org.openstreetmap.josm.tools.Pair;
 
-public final class OdPlugin extends Plugin implements OdConstants {
+public final class OdPlugin extends Plugin {
 
 	private static OdPlugin instance;
@@ -102,5 +101,5 @@
 	private void buildMenu() {
         for (Module module : ModuleHandler.moduleList) {
-        	Map<DataSetCategory, JMenu> catMenus = new HashMap<DataSetCategory, JMenu>();
+        	Map<DataSetCategory, JMenu> catMenus = new HashMap<>();
         	JMenu moduleMenu = null;
         	for (AbstractDataSetHandler handler: module.getNewlyInstanciatedHandlers()) {
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 30563)
@@ -1,16 +1,13 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.plugins.opendata.core.io.LambertCC9ZonesProjectionPatterns;
 import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionPatterns;
 
-public interface OdConstants {
+public abstract class OdConstants {
 	
 	/**
@@ -20,4 +17,5 @@
 	public static final String ISO8859_15 = "ISO-8859-15";
 	public static final String CP850 = "Cp850";
+    public static final String CP1251 = "Cp1251";
 	public static final String CP1252 = "Cp1252";
 	public static final String MAC_ROMAN = "MacRoman";
@@ -100,18 +98,4 @@
     
     /**
-     * File filter used in import/export dialogs.
-     */
-    public static final ExtensionFileFilter CSV_FILE_FILTER = new ExtensionFileFilter(CSV_EXT, CSV_EXT, tr("CSV files") + " (*."+CSV_EXT+")");
-    public static final ExtensionFileFilter XLS_FILE_FILTER = new ExtensionFileFilter(XLS_EXT, XLS_EXT, tr("XLS files") + " (*."+XLS_EXT+")");
-    public static final ExtensionFileFilter ODS_FILE_FILTER = new ExtensionFileFilter(ODS_EXT, ODS_EXT, tr("ODS files") + " (*."+ODS_EXT+")");
-    public static final ExtensionFileFilter SHP_FILE_FILTER = new ExtensionFileFilter(SHP_EXT, SHP_EXT, tr("Shapefiles") + " (*."+SHP_EXT+")");
-    public static final ExtensionFileFilter MIF_TAB_FILE_FILTER = new ExtensionFileFilter(MIF_EXT+","+TAB_EXT, MIF_EXT, tr("MapInfo files") + " (*."+MIF_EXT+",*."+TAB_EXT+")");
-    public static final ExtensionFileFilter KML_KMZ_FILE_FILTER = new ExtensionFileFilter(KML_EXT+","+KMZ_EXT, KMZ_EXT, tr("KML/KMZ files") + " (*."+KML_EXT+",*."+KMZ_EXT+")");
-    public static final ExtensionFileFilter GML_FILE_FILTER = new ExtensionFileFilter(GML_EXT, GML_EXT, tr("GML files") + " (*."+GML_EXT+")");
-    public static final ExtensionFileFilter ZIP_FILE_FILTER = new ExtensionFileFilter(ZIP_EXT, ZIP_EXT, tr("Zip Files") + " (*."+ZIP_EXT+")");
-    public static final ExtensionFileFilter SEVENZIP_FILE_FILTER = new ExtensionFileFilter(SEVENZIP_EXT, SEVENZIP_EXT, tr("7Zip Files") + " (*."+SEVENZIP_EXT+")");
-    public static final ExtensionFileFilter XML_FILE_FILTER = new ExtensionFileFilter(XML_EXT, XML_EXT, tr("OpenData XML files") + " (*."+XML_EXT+")");
-    
-    /**
      * Coordinates fields
      */
@@ -120,5 +104,5 @@
     
     // The list of all ProjectionPatterns (filled at each constructor call)
-    public static final Collection<ProjectionPatterns> PROJECTIONS = new ArrayList<ProjectionPatterns>();
+    public static final Collection<ProjectionPatterns> PROJECTIONS = new ArrayList<>();
     
     public static final ProjectionPatterns PRJ_WGS84 = new ProjectionPatterns("GPS|WGS84|°décimaux", Projections.getProjectionByCode("EPSG:4326"));
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/DownloadDataTask.java	(revision 30563)
@@ -16,5 +16,4 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.DataSetUpdater;
@@ -26,5 +25,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
 
-public class DownloadDataTask extends DownloadOsmTask implements OdConstants {
+public class DownloadDataTask extends DownloadOsmTask {
 
 	private AbstractDataSetHandler handler;
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenLinkAction.java	(revision 30563)
@@ -16,5 +16,5 @@
 
 @SuppressWarnings("serial")
-public class OpenLinkAction extends JosmAction implements OdConstants {
+public class OpenLinkAction extends JosmAction {
 
     private URL url;
@@ -37,5 +37,5 @@
 				if (index > -1) {
 					String s = url.toString().substring(index, index+1);
-					s = url.toString().replace(s, URLEncoder.encode(s, UTF8));
+					s = url.toString().replace(s, URLEncoder.encode(s, OdConstants.UTF8));
 					URI uri = new URI(s);
 		        	System.out.println("Opening "+uri);
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/OpenPreferencesActions.java	(revision 30563)
@@ -13,10 +13,10 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 
-public class OpenPreferencesActions extends JosmAction implements OdConstants {
+public class OpenPreferencesActions extends JosmAction {
 	
     public OpenPreferencesActions() {
     	super(false);
         putValue(NAME, tr("OpenData preferences"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", ICON_CORE_24));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", OdConstants.ICON_CORE_24));
 		putValue("toolbar", "opendata_open_preferences");
     }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/ViewLicenseAction.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/ViewLicenseAction.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/actions/ViewLicenseAction.java	(revision 30563)
@@ -14,5 +14,5 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class ViewLicenseAction extends JosmAction implements OdConstants {
+public class ViewLicenseAction extends JosmAction {
 
 	private final License license;
@@ -22,5 +22,5 @@
 		CheckParameterUtil.ensureParameterNotNull(license, "license");
 		this.license = license;
-        putValue(Action.SMALL_ICON, OdUtils.getImageIcon(ICON_AGREEMENT_24));
+        putValue(Action.SMALL_ICON, OdUtils.getImageIcon(OdConstants.ICON_AGREEMENT_24));
 	}
 
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 30563)
@@ -35,5 +35,5 @@
 import org.openstreetmap.josm.tools.Pair;
 
-public abstract class AbstractDataSetHandler implements OdConstants {
+public abstract class AbstractDataSetHandler {
 	
 	public abstract boolean acceptsFilename(String filename);
@@ -98,65 +98,65 @@
 	
 	protected final boolean acceptsCsvFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, CSV_EXT);
+		return acceptsFilename(filename, expected, OdConstants.CSV_EXT);
 	}
 
 	protected final boolean acceptsXlsFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, XLS_EXT);
+		return acceptsFilename(filename, expected, OdConstants.XLS_EXT);
 	}
 
 	protected final boolean acceptsOdsFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, ODS_EXT);
+		return acceptsFilename(filename, expected, OdConstants.ODS_EXT);
 	}
 
 	protected final boolean acceptsShpFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, SHP_EXT);
+		return acceptsFilename(filename, expected, OdConstants.SHP_EXT);
 	}
 
 	protected final boolean acceptsMifFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, MIF_EXT);
+		return acceptsFilename(filename, expected, OdConstants.MIF_EXT);
 	}
 
 	protected final boolean acceptsMifTabFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, MIF_EXT, TAB_EXT);
+		return acceptsFilename(filename, expected, OdConstants.MIF_EXT, OdConstants.TAB_EXT);
 	}
 
 	protected final boolean acceptsShpMifFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, SHP_EXT, MIF_EXT);
+		return acceptsFilename(filename, expected, OdConstants.SHP_EXT, OdConstants.MIF_EXT);
 	}
 
 	protected final boolean acceptsKmlFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, KML_EXT);
+		return acceptsFilename(filename, expected, OdConstants.KML_EXT);
 	}
 
 	protected final boolean acceptsKmzFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, KMZ_EXT);
+		return acceptsFilename(filename, expected, OdConstants.KMZ_EXT);
 	}
 
 	protected final boolean acceptsKmzShpFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, KMZ_EXT, SHP_EXT);
+		return acceptsFilename(filename, expected, OdConstants.KMZ_EXT, OdConstants.SHP_EXT);
 	}
 
 	protected final boolean acceptsKmzTabFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, KMZ_EXT, TAB_EXT);
+		return acceptsFilename(filename, expected, OdConstants.KMZ_EXT, OdConstants.TAB_EXT);
 	}
 
 	protected final boolean acceptsZipFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, ZIP_EXT);
+		return acceptsFilename(filename, expected, OdConstants.ZIP_EXT);
 	}
 
     protected final boolean accepts7ZipFilename(String filename, String ... expected) {
-        return acceptsFilename(filename, expected, SEVENZIP_EXT);
+        return acceptsFilename(filename, expected, OdConstants.SEVENZIP_EXT);
     }
 
 	protected final boolean acceptsCsvKmzFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, CSV_EXT, KMZ_EXT);
+		return acceptsFilename(filename, expected, OdConstants.CSV_EXT, OdConstants.KMZ_EXT);
 	}
 
 	protected final boolean acceptsCsvKmzTabFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, CSV_EXT, KMZ_EXT, TAB_EXT);
+		return acceptsFilename(filename, expected, OdConstants.CSV_EXT, OdConstants.KMZ_EXT, OdConstants.TAB_EXT);
 	}
 		
 	protected final boolean acceptsCsvXlsFilename(String filename, String ... expected) {
-		return acceptsFilename(filename, expected, CSV_EXT, XLS_EXT);
+		return acceptsFilename(filename, expected, OdConstants.CSV_EXT, OdConstants.XLS_EXT);
 	}
 	
@@ -276,5 +276,5 @@
 	
 	public final Collection<IPrimitive> extractRelevantPrimitives(DataSet ds) {
-		ArrayList<IPrimitive> result = new ArrayList<IPrimitive>();
+		ArrayList<IPrimitive> result = new ArrayList<>();
 		for (IPrimitive p : ds.allPrimitives()) {
 			if (isRelevant(p)) {
@@ -363,13 +363,13 @@
 
 	public String getLocalPortalIconName() {
-		return ICON_CORE_24;
+		return OdConstants.ICON_CORE_24;
 	}
 		
 	public String getNationalPortalIconName() {
-		return ICON_CORE_24;
+		return OdConstants.ICON_CORE_24;
 	}
 		
 	public String getDataLayerIconName() {
-		return ICON_CORE_16;
+		return OdConstants.ICON_CORE_16;
 	}
 	
@@ -387,7 +387,7 @@
 
 	protected final ExtendedSourceEntry getMapPaintStyle(String displayName, String fileNameWithoutExtension) {
-		return new ExtendedSourceEntry(displayName,	PROTO_RSRC+//"/"+
+		return new ExtendedSourceEntry(displayName,	OdConstants.PROTO_RSRC+//"/"+
 				this.getClass().getPackage().getName().replace(".", "/")+"/"+
-				fileNameWithoutExtension+"."+MAPCSS_EXT);
+				fileNameWithoutExtension+"."+OdConstants.MAPCSS_EXT);
 	}
 	
@@ -490,5 +490,5 @@
 	// Tools
 
-	private final Collection<JosmAction> tools = new ArrayList<JosmAction>();
+	private final Collection<JosmAction> tools = new ArrayList<>();
 	
 	public final Collection<JosmAction> getTools() {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/DataSetUpdater.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/DataSetUpdater.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/DataSetUpdater.java	(revision 30563)
@@ -14,5 +14,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public abstract class DataSetUpdater implements OdConstants {
+public abstract class DataSetUpdater {
 
 	public static final void updateDataSet(DataSet dataSet, AbstractDataSetHandler handler, File associatedFile) {
@@ -25,5 +25,5 @@
 				}
 			}
-			if (!Main.pref.getBoolean(PREF_RAWDATA)) {
+			if (!Main.pref.getBoolean(OdConstants.PREF_RAWDATA)) {
 				handler.updateDataSet(dataSet);
 			}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/SimpleDataSetHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/SimpleDataSetHandler.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/SimpleDataSetHandler.java	(revision 30563)
@@ -19,12 +19,13 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.OverpassApi;
 
 public abstract class SimpleDataSetHandler extends AbstractDataSetHandler {
 
-	protected static final Projection wgs84 = PRJ_WGS84.getProjection();
-
-	private final List<Tag> relevantTags = new ArrayList<Tag>();
-	private final List<Tag> forbiddenTags = new ArrayList<Tag>();
+	protected static final Projection wgs84 = OdConstants.PRJ_WGS84.getProjection();
+
+	private final List<Tag> relevantTags = new ArrayList<>();
+	private final List<Tag> forbiddenTags = new ArrayList<>();
 	
 	private final boolean relevantUnion;
@@ -152,5 +153,5 @@
 
 	protected final String[] getOverpassApiConditions() {
-		List<String> conditions = new ArrayList<String>();
+		List<String> conditions = new ArrayList<>();
 		for (Tag tag : this.relevantTags) {
 			conditions.add(OverpassApi.hasKey(tag.getKey(), tag.getValue()));
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/at/AustrianConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/at/AustrianConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/at/AustrianConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.at;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface AustrianConstants extends OdConstants {
+public interface AustrianConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/au/AustralianConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/au/AustralianConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/au/AustralianConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.au;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface AustralianConstants extends OdConstants {
+public interface AustralianConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianConstants.java	(revision 30563)
@@ -4,10 +4,10 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface BelgianConstants extends OdConstants {
+public interface BelgianConstants {
 
 	/**
 	 * Portal
 	 */
-	public static final String BELGIAN_PORTAL = "http://data.gov.be/"+PATTERN_LANG+"/dataset/";
+	public static final String BELGIAN_PORTAL = "http://data.gov.be/"+OdConstants.PATTERN_LANG+"/dataset/";
 	
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianDataSetHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianDataSetHandler.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/be/BelgianDataSetHandler.java	(revision 30563)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.SimpleDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.tabular.DefaultCsvHandler;
@@ -23,6 +24,6 @@
 	private String nationalPortalPathNl;
 
-	protected static final Projection lambert1972 = PRJ_LAMBERT_1972.getProjection();
-	protected static final Projection lambert2008 = PRJ_LAMBERT_2008.getProjection();
+	protected static final Projection lambert1972 = OdConstants.PRJ_LAMBERT_1972.getProjection();
+	protected static final Projection lambert2008 = OdConstants.PRJ_LAMBERT_2008.getProjection();
 	
 	protected static final Projection[] projections = new Projection[]{
@@ -104,5 +105,5 @@
 				nationalPortalPath = nationalPortalPathEn;
 			}
-			return new URL(BELGIAN_PORTAL.replace(PATTERN_LANG, lang.substring(0, 2))+nationalPortalPath);//FIXME
+			return new URL(BELGIAN_PORTAL.replace(OdConstants.PATTERN_LANG, lang.substring(0, 2))+nationalPortalPath);//FIXME
 		} catch (MalformedURLException e) {
 			e.printStackTrace();
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/ca/CanadianConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/ca/CanadianConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/ca/CanadianConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.ca;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface CanadianConstants extends OdConstants {
+public interface CanadianConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/cl/ChileanConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/cl/ChileanConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/cl/ChileanConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.cl;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface ChileanConstants extends OdConstants {
+public interface ChileanConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/es/SpanishConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/es/SpanishConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/es/SpanishConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.es;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface SpanishConstants extends OdConstants {
+public interface SpanishConstants {
 
 	/**
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.fr;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface FrenchConstants extends OdConstants {
+public interface FrenchConstants {
 
 	/**
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java	(revision 30563)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.SimpleDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.tabular.DefaultCsvHandler;
@@ -24,5 +25,5 @@
 	private String nationalPortalPath;
 
-	protected static final Projection lambert93 = PRJ_LAMBERT_93.getProjection(); // France metropolitaine
+	protected static final Projection lambert93 = OdConstants.PRJ_LAMBERT_93.getProjection(); // France metropolitaine
 	protected static final Projection utm20 = Projections.getProjectionByCode("EPSG:32620"); // UTM 20 N - Guadeloupe, Martinique
 	protected static final Projection utm22 = Projections.getProjectionByCode("EPSG:32622"); // UTM 22 N - Guyane
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/it/ItalianConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/it/ItalianConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/it/ItalianConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.it;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface ItalianConstants extends OdConstants {
+public interface ItalianConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/ke/KenyanConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/ke/KenyanConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/ke/KenyanConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.ke;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface KenyanConstants extends OdConstants {
+public interface KenyanConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/nl/DutchConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/nl/DutchConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/nl/DutchConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.nl;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface DutchConstants extends OdConstants {
+public interface DutchConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/no/NorwegianConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/no/NorwegianConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/no/NorwegianConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.no;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface NorwegianConstants extends OdConstants {
+public interface NorwegianConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/nz/NewZealanderConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/nz/NewZealanderConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/nz/NewZealanderConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.nz;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface NewZealanderConstants extends OdConstants {
+public interface NewZealanderConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/pt/PortugueseConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/pt/PortugueseConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/pt/PortugueseConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.pt;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface PortugueseConstants extends OdConstants {
+public interface PortugueseConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/uk/BritishConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/uk/BritishConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/uk/BritishConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.uk;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface BritishConstants extends OdConstants {
+public interface BritishConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/us/AmericanConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/us/AmericanConstants.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/us/AmericanConstants.java	(revision 30563)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.plugins.opendata.core.datasets.us;
 
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public interface AmericanConstants extends OdConstants {
+public interface AmericanConstants {
 
 	/**
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/DialogPrompter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/DialogPrompter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/DialogPrompter.java	(revision 30563)
@@ -37,5 +37,5 @@
 	}
 	
-	public final DialogPrompter promptInEdt() {
+	public final DialogPrompter<T> promptInEdt() {
 		if (SwingUtilities.isEventDispatchThread()) {
 			run();
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreference.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreference.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreference.java	(revision 30563)
@@ -56,5 +56,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 
-public class ModulePreference implements SubPreferenceSetting, OdConstants {
+public class ModulePreference implements SubPreferenceSetting {
     /*public static class Factory implements PreferenceSettingFactory {
         public PreferenceSetting createPreferenceSetting() {
@@ -221,5 +221,5 @@
             LinkedList<String> l = new LinkedList<>(model.getSelectedModuleNames());
             Collections.sort(l);
-            Main.pref.putCollection(PREF_MODULES, l);
+            Main.pref.putCollection(OdConstants.PREF_MODULES, l);
             return true;
         }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreferencesModel.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreferencesModel.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ModulePreferencesModel.java	(revision 30563)
@@ -20,5 +20,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation;
 
-public class ModulePreferencesModel extends Observable implements OdConstants {
+public class ModulePreferencesModel extends Observable {
     private final ArrayList<ModuleInformation> availableModules = new ArrayList<>();
     private final ArrayList<ModuleInformation> displayedModules = new ArrayList<>();
@@ -29,5 +29,5 @@
 
     protected Collection<String> getModules(Collection<String> def) {
-    	return Main.pref.getCollection(PREF_MODULES, def);
+    	return Main.pref.getCollection(OdConstants.PREF_MODULES, def);
     }
     
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdDialog.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdDialog.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdDialog.java	(revision 30563)
@@ -32,7 +32,7 @@
 
 @SuppressWarnings("serial")
-public class OdDialog extends ToggleDialog implements OdConstants, LayerChangeListener, EditLayerChangeListener {
+public class OdDialog extends ToggleDialog implements LayerChangeListener, EditLayerChangeListener {
 
-    private final SideButton selectButton;
+    //private final SideButton selectButton;
     private final SideButton downloadButton;
     private final SideButton diffButton;
@@ -91,10 +91,10 @@
 
 	public OdDialog() {
-		super("OpenData", ICON_CORE_24, tr("Open the OpenData window."), 
+		super("OpenData", OdConstants.ICON_CORE_24, tr("Open the OpenData window."), 
 				Shortcut.registerShortcut("subwindow:opendata", tr("Toggle: {0}", "OpenData"),
 						KeyEvent.VK_A, Shortcut.ALT_CTRL_SHIFT), 150, false, OdPreferenceSetting.class);
 		
 		this.buttons = Arrays.asList(new SideButton[] {
-				selectButton = new SideButton(new SelectAction()), 
+				/*selectButton =*/ new SideButton(new SelectAction()), 
 				downloadButton = new SideButton(new DownloadAction()), 
 				diffButton = new SideButton(new DiffAction()),
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdPreferenceSetting.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdPreferenceSetting.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/OdPreferenceSetting.java	(revision 30563)
@@ -30,5 +30,5 @@
 import org.openstreetmap.josm.tools.GBC;
 
-public class OdPreferenceSetting extends DefaultTabPreferenceSetting implements OdConstants {
+public class OdPreferenceSetting extends DefaultTabPreferenceSetting {
 
     //private final JRadioButton rbCC43 = new JRadioButton(tr("CC43"));
@@ -46,5 +46,5 @@
 
     public OdPreferenceSetting() {
-    	super(ICON_CORE_48, tr("OpenData Preferences"),
+    	super(OdConstants.ICON_CORE_48, tr("OpenData Preferences"),
                 tr("A special handler for various Open Data portals<br/><br/>"+
                         "Please read the Terms and Conditions of Use of each portal<br/>"+
@@ -58,5 +58,5 @@
      */
     public static final Collection<String> getModuleSites() {
-        return Main.pref.getCollection(PREF_MODULES_SITES, Arrays.asList(DEFAULT_MODULE_SITES));
+        return Main.pref.getCollection(OdConstants.PREF_MODULES_SITES, Arrays.asList(OdConstants.DEFAULT_MODULE_SITES));
     }
 
@@ -67,5 +67,5 @@
      */
 	public static void setModuleSites(List<String> sites) {
-		Main.pref.putCollection(PREF_MODULES_SITES, sites);
+		Main.pref.putCollection(OdConstants.PREF_MODULES_SITES, sites);
     }
     
@@ -87,5 +87,5 @@
 
         // option to enable raw data
-        rawData.setSelected(Main.pref.getBoolean(PREF_RAWDATA, DEFAULT_RAWDATA));
+        rawData.setSelected(Main.pref.getBoolean(OdConstants.PREF_RAWDATA, OdConstants.DEFAULT_RAWDATA));
         rawData.setToolTipText(tr("Import only raw data (i.e. do not add/delete tags or replace them by standard OSM tags)"));
         general.add(rawData, GBC.eop().insets(0, 0, 0, 0));
@@ -112,5 +112,5 @@
         // option to set the Overpass API server
         JLabel jLabelOapi = new JLabel(tr("Overpass API server:"));
-        oapi.setText(Main.pref.get(PREF_OAPI, DEFAULT_OAPI));
+        oapi.setText(Main.pref.get(OdConstants.PREF_OAPI, OdConstants.DEFAULT_OAPI));
         oapi.setToolTipText(tr("Overpass API server used to download OSM data"));
         general.add(jLabelOapi, GBC.std().insets(0, 5, 10, 0));
@@ -119,5 +119,5 @@
         // option to set the XAPI server
         JLabel jLabelXapi = new JLabel(tr("XAPI server:"));
-        xapi.setText(Main.pref.get(PREF_XAPI, DEFAULT_XAPI));
+        xapi.setText(Main.pref.get(OdConstants.PREF_XAPI, OdConstants.DEFAULT_XAPI));
         xapi.setToolTipText(tr("XAPI server used to download OSM data when Overpass API is not available"));
         general.add(jLabelXapi, GBC.std().insets(0, 5, 10, 0));
@@ -134,7 +134,7 @@
     	boolean result = modulePref.ok();
    		//Main.pref.put(PREF_COORDINATES, rbWGS84.isSelected() ? VALUE_WGS84 : VALUE_CC9ZONES);
-   		Main.pref.put(PREF_OAPI, oapi.getText());
-   		Main.pref.put(PREF_XAPI, xapi.getText());
-   		Main.pref.put(PREF_RAWDATA, rawData.isSelected());
+   		Main.pref.put(OdConstants.PREF_OAPI, oapi.getText());
+   		Main.pref.put(OdConstants.PREF_XAPI, xapi.getText());
+   		Main.pref.put(OdConstants.PREF_RAWDATA, rawData.isSelected());
         
         // create a task for downloading modules if the user has activated, yet not downloaded,
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/AbstractImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/AbstractImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/AbstractImporter.java	(revision 30563)
@@ -11,5 +11,4 @@
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmImporter;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.DataSetUpdater;
@@ -18,5 +17,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
 
-public abstract class AbstractImporter extends OsmImporter implements OdConstants {
+public abstract class AbstractImporter extends OsmImporter {
 	
 	protected AbstractDataSetHandler handler;
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NetworkReader.java	(revision 30563)
@@ -32,5 +32,5 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class NetworkReader extends OsmServerReader implements OdConstants {
+public class NetworkReader extends OsmServerReader {
 
 	private final String url;
@@ -47,19 +47,19 @@
     public static final Map<String, Class<? extends AbstractReader>> FILE_READERS = new HashMap<>();
     static {
-        FILE_READERS.put(CSV_EXT, CsvReader.class);
-        FILE_READERS.put(KML_EXT, KmlReader.class);
-        FILE_READERS.put(KMZ_EXT, KmzReader.class);
-        FILE_READERS.put(GML_EXT, GmlReader.class);
-        FILE_READERS.put(XLS_EXT, XlsReader.class);
-        FILE_READERS.put(ODS_EXT, OdsReader.class);
-        FILE_READERS.put(SHP_EXT, ShpReader.class);
-        FILE_READERS.put(MIF_EXT, MifReader.class);
-        FILE_READERS.put(TAB_EXT, TabReader.class);
+        FILE_READERS.put(OdConstants.CSV_EXT, CsvReader.class);
+        FILE_READERS.put(OdConstants.KML_EXT, KmlReader.class);
+        FILE_READERS.put(OdConstants.KMZ_EXT, KmzReader.class);
+        FILE_READERS.put(OdConstants.GML_EXT, GmlReader.class);
+        FILE_READERS.put(OdConstants.XLS_EXT, XlsReader.class);
+        FILE_READERS.put(OdConstants.ODS_EXT, OdsReader.class);
+        FILE_READERS.put(OdConstants.SHP_EXT, ShpReader.class);
+        FILE_READERS.put(OdConstants.MIF_EXT, MifReader.class);
+        FILE_READERS.put(OdConstants.TAB_EXT, TabReader.class);
     }
     
     public static final Map<String, Class<? extends AbstractReader>> FILE_AND_ARCHIVE_READERS = new HashMap<>(FILE_READERS);
     static {
-        FILE_AND_ARCHIVE_READERS.put(ZIP_EXT, ZipReader.class);
-        FILE_AND_ARCHIVE_READERS.put(SEVENZIP_EXT, SevenZipReader.class);
+        FILE_AND_ARCHIVE_READERS.put(OdConstants.ZIP_EXT, ZipReader.class);
+        FILE_AND_ARCHIVE_READERS.put(OdConstants.SEVENZIP_EXT, SevenZipReader.class);
     }
 
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/OsmDownloader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/OsmDownloader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/OsmDownloader.java	(revision 30563)
@@ -9,12 +9,12 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public class OsmDownloader implements OdConstants {
+public class OsmDownloader {
 	
 	public static final void downloadOapi(String oapiReq) {
 		if (oapiReq != null) {
 			try {
-				String oapiServer = Main.pref.get(PREF_OAPI, DEFAULT_OAPI);
+				String oapiServer = Main.pref.get(OdConstants.PREF_OAPI, OdConstants.DEFAULT_OAPI);
 				System.out.println(oapiReq);
-				String oapiReqEnc = URLEncoder.encode(oapiReq, UTF8);
+				String oapiReqEnc = URLEncoder.encode(oapiReq, OdConstants.UTF8);
 				Main.main.menu.openLocation.openUrl(false, oapiServer+"data="+oapiReqEnc);
 			} catch (UnsupportedEncodingException e) {
@@ -26,5 +26,5 @@
 	public static final void downloadXapi(Collection<String> xapiReqs) {
 		if (xapiReqs != null) {
-			String xapiServer = Main.pref.get(PREF_XAPI, DEFAULT_XAPI);
+			String xapiServer = Main.pref.get(OdConstants.PREF_XAPI, OdConstants.DEFAULT_XAPI);
 			for (String xapiReq : xapiReqs) {
 				Main.main.menu.openLocation.openUrl(false, xapiServer+xapiReq);
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 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionPatterns.java	(revision 30563)
@@ -7,5 +7,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public class ProjectionPatterns implements OdConstants {
+public class ProjectionPatterns {
 
 	private final Pattern xPattern;
@@ -17,5 +17,5 @@
 		this.yPattern = yPattern;
 		this.projection = projection;
-		PROJECTIONS.add(this);
+		OdConstants.PROJECTIONS.add(this);
 	}
 
@@ -25,9 +25,9 @@
 
 	public ProjectionPatterns(String proj, Projection projection) {
-		this(getCoordinatePattern(X_STRING, proj), getCoordinatePattern(Y_STRING, proj), projection);
+		this(getCoordinatePattern(OdConstants.X_STRING, proj), getCoordinatePattern(OdConstants.Y_STRING, proj), projection);
 	}
 
 	public ProjectionPatterns(String proj) {
-		this(getCoordinatePattern(X_STRING, proj), getCoordinatePattern(Y_STRING, proj), null);
+		this(getCoordinatePattern(OdConstants.X_STRING, proj), getCoordinatePattern(OdConstants.Y_STRING, proj), null);
 	}
 	
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/XmlImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/XmlImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/XmlImporter.java	(revision 30563)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.File;
@@ -8,9 +10,14 @@
 import javax.xml.bind.JAXBException;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
 public class XmlImporter extends AbstractImporter {
+
+    public static final ExtensionFileFilter XML_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.XML_EXT, OdConstants.XML_EXT, tr("OpenData XML files") + " (*."+OdConstants.XML_EXT+")");
 
 	public XmlImporter() {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ArchiveReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ArchiveReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ArchiveReader.java	(revision 30563)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.io.NeptuneReader;
 import org.openstreetmap.josm.plugins.opendata.core.io.NetworkReader;
+import org.openstreetmap.josm.plugins.opendata.core.io.XmlImporter;
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.GmlReader;
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.KmlReader;
@@ -34,5 +35,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
 
-public abstract class ArchiveReader extends AbstractReader implements OdConstants {
+public abstract class ArchiveReader extends AbstractReader {
 
     protected final AbstractDataSetHandler handler;
@@ -113,23 +114,23 @@
                 instance = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
             }
-            if (file.getName().toLowerCase().endsWith(CSV_EXT)) {
+            if (file.getName().toLowerCase().endsWith(OdConstants.CSV_EXT)) {
                 from = CsvReader.parseDataSet(in, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(KML_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.KML_EXT)) {
                 from = KmlReader.parseDataSet(in, instance);
-            } else if (file.getName().toLowerCase().endsWith(KMZ_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.KMZ_EXT)) {
                 from = KmzReader.parseDataSet(in, instance);
-            } else if (file.getName().toLowerCase().endsWith(XLS_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.XLS_EXT)) {
                 from = XlsReader.parseDataSet(in, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(ODS_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.ODS_EXT)) {
                 from = OdsReader.parseDataSet(in, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(SHP_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.SHP_EXT)) {
                 from = ShpReader.parseDataSet(in, file, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(MIF_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.MIF_EXT)) {
                 from = MifReader.parseDataSet(in, file, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(TAB_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.TAB_EXT)) {
                 from = TabReader.parseDataSet(in, file, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(GML_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.GML_EXT)) {
                 from = GmlReader.parseDataSet(in, handler, instance);
-            } else if (file.getName().toLowerCase().endsWith(XML_EXT)) {
+            } else if (file.getName().toLowerCase().endsWith(OdConstants.XML_EXT)) {
                 if (OdPlugin.getInstance().xmlImporter.acceptFile(file)) {
                     from = NeptuneReader.parseDataSet(in, handler, instance);
@@ -155,5 +156,5 @@
         }
         // Special treatment for XML files (check supported XSD), unless handler explicitely skip it
-        if (XML_FILE_FILTER.accept(file) && ((archiveHandler != null && archiveHandler.skipXsdValidation()) 
+        if (XmlImporter.XML_FILE_FILTER.accept(file) && ((archiveHandler != null && archiveHandler.skipXsdValidation()) 
                 || OdPlugin.getInstance().xmlImporter.acceptFile(file))) {
             candidates.add(file);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/SevenZipImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/SevenZipImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/SevenZipImporter.java	(revision 30563)
@@ -2,12 +2,19 @@
 package org.openstreetmap.josm.plugins.opendata.core.io.archive;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class SevenZipImporter extends AbstractImporter {
+
+    public static final ExtensionFileFilter SEVENZIP_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.SEVENZIP_EXT, OdConstants.SEVENZIP_EXT, tr("7Zip Files") + " (*."+OdConstants.SEVENZIP_EXT+")");
 
 	public SevenZipImporter() {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipImporter.java	(revision 30563)
@@ -1,14 +1,21 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io.archive;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.File;
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class ZipImporter extends AbstractImporter {
+
+    public static final ExtensionFileFilter ZIP_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.ZIP_EXT, OdConstants.ZIP_EXT, tr("Zip Files") + " (*."+OdConstants.ZIP_EXT+")");
 
 	public ZipImporter() {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/AbstractMapInfoReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/AbstractMapInfoReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/AbstractMapInfoReader.java	(revision 30563)
@@ -15,5 +15,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public abstract class AbstractMapInfoReader extends AbstractReader implements OdConstants {
+public abstract class AbstractMapInfoReader extends AbstractReader {
 
 	protected static final String VERSION_1 = "1";
@@ -22,5 +22,6 @@
 	protected static final String VERSION_450 = "450";
 
-	protected static final String CHARSET_WINDOWS = "WindowsLatin1";
+	protected static final String CHARSET_WINDOWS_LATIN    = "WindowsLatin1";
+    protected static final String CHARSET_WINDOWS_CYRILLIC = "WindowsCyrillic";
 	protected static final String CHARSET_NEUTRAL = "Neutral";
 	protected static final String CHARSET_MAC     = "MacRoman";
@@ -46,6 +47,5 @@
 	}
 	
-	@SuppressWarnings("resource")
-    protected final BufferedReader getDataReader(File headerFile, String extension, Charset charset) throws FileNotFoundException {
+	protected final BufferedReader getDataReader(File headerFile, String extension, Charset charset) throws FileNotFoundException {
 		File dataFile = getDataFile(headerFile, extension);
 		return dataFile.exists() ? new BufferedReader(new InputStreamReader(new FileInputStream(dataFile), charset)) : null;
@@ -58,10 +58,12 @@
 	protected Charset parseCharset(String[] words, int index) {
 		words[index] = words[index].replace("\"", "");
-		if (words[index].equalsIgnoreCase(CHARSET_WINDOWS)) {
-			return Charset.forName(CP1252);
+		if (words[index].equalsIgnoreCase(CHARSET_WINDOWS_LATIN)) {
+			return Charset.forName(OdConstants.CP1252);
+        } else if (words[index].equalsIgnoreCase(CHARSET_WINDOWS_CYRILLIC)) {
+            return Charset.forName(OdConstants.CP1251);
 		} else if (words[index].equalsIgnoreCase(CHARSET_NEUTRAL)) {
-			return Charset.forName(ISO8859_15);
+			return Charset.forName(OdConstants.ISO8859_15);
 		} else if (words[index].equalsIgnoreCase(CHARSET_MAC)) {
-			return Charset.forName(MAC_ROMAN);
+			return Charset.forName(OdConstants.MAC_ROMAN);
 		} else {
 			System.err.println("Line "+lineNum+". Unknown charset detected: "+line);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultShpHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultShpHandler.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultShpHandler.java	(revision 30563)
@@ -35,5 +35,5 @@
 import org.openstreetmap.josm.tools.Pair;
 
-public class DefaultShpHandler extends DefaultGeographicHandler implements ShpHandler, OdConstants {
+public class DefaultShpHandler extends DefaultGeographicHandler implements ShpHandler {
 
 	private static final List<Pair<org.opengis.referencing.datum.Ellipsoid, Ellipsoid>> 
@@ -49,6 +49,6 @@
 	
 	private static final boolean equals(Double a, Double b) {
-		boolean res = Math.abs(a - b) <= Main.pref.getDouble(PREF_CRS_COMPARISON_TOLERANCE, DEFAULT_CRS_COMPARISON_TOLERANCE);
-		if (Main.pref.getBoolean(PREF_CRS_COMPARISON_DEBUG, false)) {
+		boolean res = Math.abs(a - b) <= Main.pref.getDouble(OdConstants.PREF_CRS_COMPARISON_TOLERANCE, OdConstants.DEFAULT_CRS_COMPARISON_TOLERANCE);
+		if (Main.pref.getBoolean(OdConstants.PREF_CRS_COMPARISON_DEBUG, false)) {
 			System.out.println("Comparing "+a+" and "+b+" -> "+res);
 		}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 30563)
@@ -50,5 +50,5 @@
 import com.vividsolutions.jts.geom.Point;
 
-public abstract class GeographicReader extends AbstractReader implements OdConstants {
+public abstract class GeographicReader extends AbstractReader {
 
 	protected static CoordinateReferenceSystem wgs84;
@@ -172,5 +172,5 @@
      */
     protected static final boolean warnLenientMethod(final Component parent, final CoordinateReferenceSystem crs) {
-    	return new DialogPrompter() {
+    	return new DialogPrompter<ExtendedDialog>() {
 			@Override
 			protected ExtendedDialog buildDialog() {
@@ -265,9 +265,9 @@
     						
     						Hints.putSystemDefault(Hints.COMPARISON_TOLERANCE, 
-    								Main.pref.getDouble(PREF_CRS_COMPARISON_TOLERANCE, DEFAULT_CRS_COMPARISON_TOLERANCE));
+    								Main.pref.getDouble(OdConstants.PREF_CRS_COMPARISON_TOLERANCE, OdConstants.DEFAULT_CRS_COMPARISON_TOLERANCE));
     						if (((AbstractCRS)candidate).equals((AbstractIdentifiedObject)crs, false)) {
     							System.out.println("Found a potential CRS: "+candidate.getName());
     							candidates.add(candidate);
-    						} else if (Main.pref.getBoolean(PREF_CRS_COMPARISON_DEBUG, false)) {
+    						} else if (Main.pref.getBoolean(OdConstants.PREF_CRS_COMPARISON_DEBUG, false)) {
     							compareDebug(crs, candidate);
     						}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlImporter.java	(revision 30563)
@@ -2,13 +2,20 @@
 package org.openstreetmap.josm.plugins.opendata.core.io.geographic;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class GmlImporter extends AbstractImporter {
 	
+    public static final ExtensionFileFilter GML_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.GML_EXT, OdConstants.GML_EXT, tr("GML files") + " (*."+OdConstants.GML_EXT+")");
+
     public GmlImporter() {
         super(GML_FILE_FILTER);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GmlReader.java	(revision 30563)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.UTFInputStreamReader;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.NationalHandlers;
@@ -66,5 +67,5 @@
     }
 
-    private final Map<String, CrsData> crsDataMap = new HashMap<String, GmlReader.CrsData>();
+    private final Map<String, CrsData> crsDataMap = new HashMap<>();
     
     public GmlReader(XMLStreamReader parser, GmlHandler handler) {
@@ -75,5 +76,5 @@
 
 	public static DataSet parseDataSet(InputStream in, AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException, XMLStreamException {
-        InputStreamReader ir = UTFInputStreamReader.create(in, UTF8);
+        InputStreamReader ir = UTFInputStreamReader.create(in, OdConstants.UTF8);
         XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(ir);
         try {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlKmzImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlKmzImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlKmzImporter.java	(revision 30563)
@@ -2,13 +2,20 @@
 package org.openstreetmap.josm.plugins.opendata.core.io.geographic;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class KmlKmzImporter extends AbstractImporter {
 	
+    public static final ExtensionFileFilter KML_KMZ_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.KML_EXT+","+OdConstants.KMZ_EXT, OdConstants.KMZ_EXT, tr("KML/KMZ files") + " (*."+OdConstants.KML_EXT+",*."+OdConstants.KMZ_EXT+")");
+
     public KmlKmzImporter() {
         super(KML_KMZ_FILE_FILTER);
@@ -19,5 +26,5 @@
 			throws IllegalDataException {
 		try {
-			if (file.getName().toLowerCase().endsWith(KML_EXT)) {
+			if (file.getName().toLowerCase().endsWith(OdConstants.KML_EXT)) {
 				return KmlReader.parseDataSet(in, instance);
 			} else {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmlReader.java	(revision 30563)
@@ -29,5 +29,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionPatterns;
 
-public class KmlReader extends AbstractReader implements OdConstants {
+public class KmlReader extends AbstractReader {
 
     public static final String KML_PLACEMARK   = "Placemark";
@@ -52,6 +52,7 @@
 
 	public static DataSet parseDataSet(InputStream in, ProgressMonitor instance) throws IOException, XMLStreamException, FactoryConfigurationError {
-        InputStreamReader ir = UTFInputStreamReader.create(in, UTF8);
+        InputStreamReader ir = UTFInputStreamReader.create(in);
         XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(ir);
+	    //XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(in, UTF8);
         return new KmlReader(parser).parseDoc();
 	}
@@ -71,5 +72,5 @@
 	
 	private static boolean keyIsIgnored(String key) {
-		for (ProjectionPatterns pp : PROJECTIONS) {
+		for (ProjectionPatterns pp : OdConstants.PROJECTIONS) {
 			if (pp.getXPattern().matcher(key).matches() || pp.getYPattern().matcher(key).matches()) {
 				return true;
@@ -80,10 +81,10 @@
 	
 	private void parsePlaceMark(DataSet ds) throws XMLStreamException {
-		List<OsmPrimitive> list = new ArrayList<OsmPrimitive>();
+		List<OsmPrimitive> list = new ArrayList<>();
 		Way way = null;
 		Node node = null;
 		Relation relation = null;
 		String role = "";
-		Map<String, String> tags = new HashMap<String, String>();
+		Map<String, String> tags = new HashMap<>();
 		while (parser.hasNext()) {
             int event = parser.next();
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmzReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmzReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/KmzReader.java	(revision 30563)
@@ -16,7 +16,6 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.AbstractReader;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public class KmzReader extends AbstractReader implements OdConstants {
+public class KmzReader extends AbstractReader {
 
 	private ZipInputStream zis;
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java	(revision 30563)
@@ -14,5 +14,7 @@
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
-
+import java.util.Arrays;
+
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -25,451 +27,498 @@
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
 
 /**
- * MapInfo Interchange File (MIF) reader, based on this specification:
- * http://www.gissky.com/Download/Download/DataFormat/Mapinfo_Mif.pdf
- *
+ * MapInfo Interchange File (MIF) reader, based on these specifications:<ul>
+ * <li><a href="http://www.gissky.com/Download/Download/DataFormat/Mapinfo_Mif.pdf">Mapinfo_Mif.pdf (dead link)</a></li>
+ * <li><a href="http://resource.mapinfo.com/static/files/document/1074660800077/interchange_file.pdf">interchange_file.pdf</a></li>
+ * </ul>
  */
 public class MifReader extends AbstractMapInfoReader {
 
-	private enum State {
-		UNKNOWN,
-		READING_COLUMNS,
-		START_POLYGON,
-		READING_POINTS,
-		END_POLYGON,
-		START_POLYLINE,
-		END_POLYLINE
-	}
-
-	protected BufferedReader midReader;
-
-	private Character delimiter = '\t';
-	
-	private State state = State.UNKNOWN;
-	
-	private Projection josmProj;
-	private DataSet ds;
-	private Relation region;
-	private Way polygon;
-	private Node node;
-	private Way polyline;
-
-	// CoordSys clause
-	private MifProjection proj;
-	private MifDatum datum;
-	private String units;
-	private Double originLon;
-	private Double originLat;
-	private Double stdP1;
-	private Double stdP2;
-	private Double azimuth;
-	private Double scaleFactor;
-	private Double falseEasting;
-	private Double falseNorthing;
-	private Double range;
-	
-	// Region clause
-	private int numpolygons = -1;
-	private int numpts = -1;
-	
-	public static DataSet parseDataSet(InputStream in, File file,
-			AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
-		return new MifReader().parse(in, file, instance, Charset.forName(ISO8859_15));
-	}
-
-	private void parseDelimiter(String[] words) {
-		delimiter = words[1].charAt(1);
-	}
-
-	private void parseUnique(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private void parseIndex(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private void parseCoordSys(String[] words) {
-		for (int i = 0; i<words.length; i++) {
-			words[i] = words[i].replace(",", "");
-		}
-		if (words[1].equalsIgnoreCase("Earth")) {
-			proj = MifProjection.forCode(Integer.parseInt(words[3]));
-			datum = MifDatum.forCode(Integer.parseInt(words[4]));
-
-			// Custom datum: TODO: use custom decalage values
-			int offset = datum == Custom ? 4 : 0;
-
-			if (proj == Longitude_Latitude) {
-				josmProj = Projections.getProjectionByCode("EPSG:4326"); // WGS 84
-				return;
-			}
-			
-			// Units
-			units = words[5+offset];
-			
-			// Origin, longitude
-			originLon = Double.parseDouble(words[6+offset]);
-			
-			// Origin, latitude
-			switch(proj) {
-			case Albers_Equal_Area_Conic:
-			case Azimuthal_Equidistant_polar_aspect_only:
-			case Equidistant_Conic_also_known_as_Simple_Conic:
-			case Hotine_Oblique_Mercator:
-			case Lambert_Azimuthal_Equal_Area_polar_aspect_only:
-			case Lambert_Conformal_Conic:
-			case Lambert_Conformal_Conic_modified_for_Belgium_1972:
-			case New_Zealand_Map_Grid:
-			case Stereographic:
-			case Swiss_Oblique_Mercator:
-			case Transverse_Mercator_also_known_as_Gauss_Kruger:
-			case Transverse_Mercator_modified_for_Danish_System_34_Jylland_Fyn:
-			case Transverse_Mercator_modified_for_Danish_System_45_Bornholm:
-			case Transverse_Mercator_modified_for_Finnish_KKJ:
-			case Transverse_Mercator_modified_for_Sjaelland:
-			case Polyconic:
-				originLat = Double.parseDouble(words[7+offset]);
-				break;
-			}
-			
-			// Standard Parallel 1
-			switch (proj) {
-			case Cylindrical_Equal_Area:
-			case Regional_Mercator:
-				stdP1 = Double.parseDouble(words[7+offset]);
-				break;
-			case Albers_Equal_Area_Conic:
-			case Equidistant_Conic_also_known_as_Simple_Conic:
-			case Lambert_Conformal_Conic:
-			case Lambert_Conformal_Conic_modified_for_Belgium_1972:
-				stdP1 = Double.parseDouble(words[8+offset]);
-				break;
-			}
-
-			// Standard Parallel 2
-			switch (proj) {
-			case Albers_Equal_Area_Conic:
-			case Equidistant_Conic_also_known_as_Simple_Conic:
-			case Lambert_Conformal_Conic:
-			case Lambert_Conformal_Conic_modified_for_Belgium_1972:
-				stdP2 = Double.parseDouble(words[9+offset]);
-				break;
-			}
-			
-			// Azimuth
-			if (proj == Hotine_Oblique_Mercator) {
-				azimuth = Double.parseDouble(words[8+offset]);
-			}
-
-			// Scale Factor
-			switch (proj) {
-			case Hotine_Oblique_Mercator:
-				scaleFactor = Double.parseDouble(words[9+offset]);
-				break;
-			case Stereographic:
-			case Transverse_Mercator_also_known_as_Gauss_Kruger:
-			case Transverse_Mercator_modified_for_Danish_System_34_Jylland_Fyn:
-			case Transverse_Mercator_modified_for_Danish_System_45_Bornholm:
-			case Transverse_Mercator_modified_for_Finnish_KKJ:
-			case Transverse_Mercator_modified_for_Sjaelland:
-				scaleFactor = Double.parseDouble(words[8+offset]);
-				break;
-			}
-			
-			// False Easting/Northing
-			switch (proj) {
-			case Albers_Equal_Area_Conic:
-			case Equidistant_Conic_also_known_as_Simple_Conic:
-			case Hotine_Oblique_Mercator:
-			case Lambert_Conformal_Conic:
-			case Lambert_Conformal_Conic_modified_for_Belgium_1972:
-				falseEasting = Double.parseDouble(words[10+offset]);
-				falseNorthing = Double.parseDouble(words[11+offset]);
-				break;
-			case Stereographic:
-			case Transverse_Mercator_also_known_as_Gauss_Kruger:
-			case Transverse_Mercator_modified_for_Danish_System_34_Jylland_Fyn:
-			case Transverse_Mercator_modified_for_Danish_System_45_Bornholm:
-			case Transverse_Mercator_modified_for_Finnish_KKJ:
-			case Transverse_Mercator_modified_for_Sjaelland:
-				falseEasting = Double.parseDouble(words[9+offset]);
-				falseNorthing = Double.parseDouble(words[10+offset]);
-				break;
-			case New_Zealand_Map_Grid:
-			case Swiss_Oblique_Mercator:
-			case Polyconic:
-				falseEasting = Double.parseDouble(words[8+offset]);
-				falseNorthing = Double.parseDouble(words[9+offset]);
-				break;
-			}
-										
-			// Range
-			switch (proj) {
-			case Azimuthal_Equidistant_polar_aspect_only:
-			case Lambert_Azimuthal_Equal_Area_polar_aspect_only:
-				range = Double.parseDouble(words[8+offset]);
-			}
-
-			switch (proj) {
-			case Lambert_Conformal_Conic:
-				if ((datum == Geodetic_Reference_System_1980_GRS_80 || datum == Custom) && equals(originLon, 3.0)) {
-					// This sounds good for Lambert 93 or Lambert CC 9
-					if (equals(originLat, 46.5) && equals(stdP1, 44.0) && equals(stdP2, 49.0) && equals(falseEasting, 700000.0) && equals(falseNorthing, 6600000.0)) {
-						josmProj = Projections.getProjectionByCode("EPSG:2154"); // Lambert 93
-					} else if (equals(falseEasting, 1700000.0)) {
-						for (int i=0; josmProj == null && i<9; i++) {
-							if (equals(originLat, 42.0+i) && equals(stdP1, 41.25+i) && equals(stdP2, 42.75+i) && equals(falseNorthing, (i+1)*1000000.0 + 200000.0)) {
-								josmProj = Projections.getProjectionByCode("EPSG:"+Integer.toString(3942 + i)); // LambertCC9Zones
-							}
-						}
-					}
-				}
-				break;
-			default:
-				// TODO
-				System.err.println("TODO: "+line);
-			}
-			
-		} else if (words[1].equalsIgnoreCase("Nonearth")) {
-			// TODO
-			System.err.println("TODO: "+line);
-		} else if (words[1].equalsIgnoreCase("Layout")) {
-			// TODO
-			System.err.println("TODO: "+line);
-		} else if (words[1].equalsIgnoreCase("Table")) {
-			// TODO
-			System.err.println("TODO: "+line);
-		} else if (words[1].equalsIgnoreCase("Window")) {
-			// TODO
-			System.err.println("TODO: "+line);
-		} else {
-			System.err.println("Line "+lineNum+". Invalid CoordSys clause: "+line);
-		}
-	}
-
-	private void parseTransform(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	@Override
-	protected void parseColumns(String[] words) {
-		super.parseColumns(words);
-		state = State.READING_COLUMNS;
-	}
-
-	private void parseData(String[] words) {
-		if (ds == null) {
-			ds = new DataSet();
-		}
-	}
-	
-	private void parsePoint(String[] words) throws IOException {
-		readAttributes(createNode(words[1], words[2]));
-	}
-
-	private void parseLine(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-	
-	private void parsePLine(String[] words) throws IOException {
-		if (words.length > 2) {
-			// TODO: pline with multiple sections
-			polyline = new Way();
-			ds.addPrimitive(polyline);
-			readAttributes(polyline);
-			numpts = Integer.parseInt(words[1]); // Not described in PDF but found in real files: PLINE XX, with XX = numpoints
-			state = State.READING_POINTS;
-		} else {
-			numpts = -1;
-			state = State.START_POLYLINE;
-		}
-	}
-
-	private void parseRegion(String[] words) throws IOException {
-		region = new Relation();
-		region.put("type", "multipolygon");
-		ds.addPrimitive(region);
-		readAttributes(region);
-		numpolygons = Integer.parseInt(words[1]);
-		state = State.START_POLYGON;
-	}
-
-	private void parseArc(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private void parseText(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private void parseRect(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private void parseRoundRect(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private void parseEllipse(String[] words) {
-		// TODO
-		System.err.println("TODO: "+line);
-	}
-
-	private DataSet parse(InputStream in, File file, ProgressMonitor instance, Charset charset) throws IOException {
-		try {
-			headerReader = new BufferedReader(new InputStreamReader(in, charset));
-			midReader = getDataReader(file, ".mid", charset);
-			parseHeader();
-			if (midReader != null) {
-				midReader.close();
-			}
-			return ds;
-		} catch (UnsupportedEncodingException e) {
-			throw new IOException(e);
-		}
-	}
-
-	@Override
-	protected void parseHeaderLine(String[] words) throws IOException {
-		if (words[0].equalsIgnoreCase("Version")) {
-			parseVersion(words);
-		} else if (words[0].equalsIgnoreCase("Charset")) {
-			parseCharset(words);
-		} else if (words[0].equalsIgnoreCase("Delimiter")) {
-			parseDelimiter(words);
-		} else if (words[0].equalsIgnoreCase("Unique")) {
-			parseUnique(words);
-		} else if (words[0].equalsIgnoreCase("Index")) {
-			parseIndex(words);
-		} else if (words[0].equalsIgnoreCase("CoordSys")) {
-			parseCoordSys(words);
-		} else if (words[0].equalsIgnoreCase("Transform")) {
-			parseTransform(words);
-		} else if (words[0].equalsIgnoreCase("Columns")) {
-			parseColumns(words);
-		} else if (words[0].equalsIgnoreCase("Data")) {
-			parseData(words);
-		} else if (ds != null) {
-			if (state == State.START_POLYGON) {
-				numpts = Integer.parseInt(words[0]);
-				polygon = new Way();
-				ds.addPrimitive(polygon);
-				region.addMember(new RelationMember("outer", polygon));
-				state = State.READING_POINTS;
-				
-			} else if (state == State.START_POLYLINE) {
-				numpts = Integer.parseInt(words[0]);
-				polyline = new Way();
-				ds.addPrimitive(polyline);
-				readAttributes(polyline);
-				state = State.READING_POINTS;
-				
-			} else if (state == State.READING_POINTS && numpts > 0) {
-				if (josmProj != null) {
-					node = createNode(words[0], words[1]);
-					if (polygon != null) {
-						polygon.addNode(node);
-					} else if (polyline != null) {
-						polyline.addNode(node);
-					}
-				}
-				if (--numpts == 0) {
-					if (numpolygons > -1) {
-						if (--numpolygons > 0) {
-							state = State.START_POLYGON;
-						} else {
-							state = State.END_POLYGON;
-							polygon = null;
-						}
-					} else if (polyline != null) {
-						state = State.UNKNOWN;
-						polyline = null;
-					}
-				}
-			} else if (words[0].equalsIgnoreCase("Point")) {
-				parsePoint(words);
-			} else if (words[0].equalsIgnoreCase("Line")) {
-				parseLine(words);
-			} else if (words[0].equalsIgnoreCase("PLine")) {
-				parsePLine(words);
-			} else if (words[0].equalsIgnoreCase("Region")) {
-				parseRegion(words);
-			} else if (words[0].equalsIgnoreCase("Arc")) {
-				parseArc(words);
-			} else if (words[0].equalsIgnoreCase("Text")) {
-				parseText(words);
-			} else if (words[0].equalsIgnoreCase("Rect")) {
-				parseRect(words);
-			} else if (words[0].equalsIgnoreCase("RoundRect")) {
-				parseRoundRect(words);
-			} else if (words[0].equalsIgnoreCase("Ellipse")) {
-				parseEllipse(words);
-			} else if (words[0].equalsIgnoreCase("Pen")) {
-				// Do nothing
-			} else if (words[0].equalsIgnoreCase("Brush")) {
-				// Do nothing
-			} else if (words[0].equalsIgnoreCase("Center")) {
-				// Do nothing
-			} else if (words[0].equalsIgnoreCase("Symbol")) {
-				// Do nothing
-			} else if (words[0].equalsIgnoreCase("Font")) {
-				// Do nothing
-			} else if (!words[0].isEmpty()) {
-				System.err.println("Line "+lineNum+". Unknown clause in data section: "+line);
-			}
-		} else if (state == State.READING_COLUMNS && numcolumns > 0) {
-			columns.add(words[0]);
-			if (--numcolumns == 0) {
-				state = State.UNKNOWN;
-			}
-		} else if (!line.isEmpty()) {
-			System.err.println("Line "+lineNum+". Unknown clause in header: "+line);
-		}
-	}
-	
-	protected void readAttributes(OsmPrimitive p) throws IOException {
-		if (midReader != null) { 
-			String midLine = midReader.readLine();
-			if (midLine != null) {
-				String[] fields = OdUtils.stripQuotesAndExtraChars(midLine.split(delimiter.toString()), delimiter.toString());
-				if (columns.size() != fields.length) {
-					System.err.println("Error: Incoherence between MID and MIF files ("+columns.size()+" columns vs "+fields.length+" fields)");
-				}
-				for (int i=0; i<Math.min(columns.size(), fields.length); i++) {
-					String field = fields[i].trim();
-					/*if (field.startsWith("\"") && field.endsWith("\"")) {
-						field = fields[i].substring(fields[i].indexOf('"')+1, fields[i].lastIndexOf('"'));
-					}*/
-					if (!field.isEmpty()) {
-						p.put(columns.get(i), field);
-					}
-				}
-			}
-		}
-	}
-	
-	protected final Node createNode(String x, String y) {
-		Node node = new Node(josmProj.eastNorth2latlon(new EastNorth(Double.parseDouble(x), Double.parseDouble(y))));
-		ds.addPrimitive(node);
-		return node;
-	}
-	
-	/** Compare two doubles within a default epsilon */
-	public static boolean equals(Double a, Double b) {
-		if (a==b) return true;
-		// If the difference is less than epsilon, treat as equal.
-		return Math.abs(a - b) < 0.0000001;
-	}
+    private enum State {
+        UNKNOWN,
+        READING_COLUMNS,
+        START_POLYGON,
+        READING_POINTS,
+        END_POLYGON,
+        START_POLYLINE,
+        END_POLYLINE
+    }
+
+    protected BufferedReader midReader;
+
+    private Character delimiter = '\t';
+    
+    private State state = State.UNKNOWN;
+    
+    private Projection josmProj;
+    private DataSet ds;
+    private Relation region;
+    private Way polygon;
+    private Node node;
+    private Way polyline;
+
+    // CoordSys clause
+    private MifProjection proj;
+    private MifDatum datum;
+    private String units;
+    private Double originLon;
+    private Double originLat;
+    private Double stdP1;
+    private Double stdP2;
+    private Double azimuth;
+    private Double scaleFactor;
+    private Double falseEasting;
+    private Double falseNorthing;
+    private Double range;
+    private Double minx;
+    private Double miny;
+    private Double maxx;
+    private Double maxy;
+    
+    // Region clause
+    private int numpolygons = -1;
+    private int numpts = -1;
+    
+    public static DataSet parseDataSet(InputStream in, File file,
+            AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
+        return new MifReader().parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
+    }
+
+    private void parseDelimiter(String[] words) {
+        delimiter = words[1].charAt(1);
+    }
+
+    private void parseUnique(String[] words) {
+        // TODO
+        Main.warn("TODO Unique: "+line);
+    }
+
+    private void parseIndex(String[] words) {
+        // TODO
+        Main.warn("TODO Index: "+line);
+    }
+
+    private void parseCoordSysSyntax1(String[] words) {
+        proj = MifProjection.forCode(Integer.parseInt(words[3]));
+        datum = MifDatum.forCode(Integer.parseInt(words[4]));
+
+        // Custom datum: TODO: use custom decalage values
+        int offset = datum == Custom ? 4 : 0;
+
+        if (proj == Longitude_Latitude) {
+            josmProj = Projections.getProjectionByCode("EPSG:4326"); // WGS 84
+            return;
+        }
+        
+        // Units
+        units = words[5+offset];
+        
+        // Origin, longitude
+        originLon = Double.parseDouble(words[6+offset]);
+        
+        // Origin, latitude
+        switch(proj) {
+        case Albers_Equal_Area_Conic:
+        case Azimuthal_Equidistant_polar_aspect_only:
+        case Equidistant_Conic_also_known_as_Simple_Conic:
+        case Hotine_Oblique_Mercator:
+        case Lambert_Azimuthal_Equal_Area_polar_aspect_only:
+        case Lambert_Conformal_Conic:
+        case Lambert_Conformal_Conic_modified_for_Belgium_1972:
+        case New_Zealand_Map_Grid:
+        case Stereographic:
+        case Swiss_Oblique_Mercator:
+        case Transverse_Mercator_also_known_as_Gauss_Kruger:
+        case Transverse_Mercator_modified_for_Danish_System_34_Jylland_Fyn:
+        case Transverse_Mercator_modified_for_Danish_System_45_Bornholm:
+        case Transverse_Mercator_modified_for_Finnish_KKJ:
+        case Transverse_Mercator_modified_for_Sjaelland:
+        case Polyconic:
+            originLat = Double.parseDouble(words[7+offset]);
+            break;
+        }
+        
+        // Standard Parallel 1
+        switch (proj) {
+        case Cylindrical_Equal_Area:
+        case Regional_Mercator:
+            stdP1 = Double.parseDouble(words[7+offset]);
+            break;
+        case Albers_Equal_Area_Conic:
+        case Equidistant_Conic_also_known_as_Simple_Conic:
+        case Lambert_Conformal_Conic:
+        case Lambert_Conformal_Conic_modified_for_Belgium_1972:
+            stdP1 = Double.parseDouble(words[8+offset]);
+            break;
+        }
+
+        // Standard Parallel 2
+        switch (proj) {
+        case Albers_Equal_Area_Conic:
+        case Equidistant_Conic_also_known_as_Simple_Conic:
+        case Lambert_Conformal_Conic:
+        case Lambert_Conformal_Conic_modified_for_Belgium_1972:
+            stdP2 = Double.parseDouble(words[9+offset]);
+            break;
+        }
+        
+        // Azimuth
+        if (proj == Hotine_Oblique_Mercator) {
+            azimuth = Double.parseDouble(words[8+offset]);
+        }
+
+        // Scale Factor
+        switch (proj) {
+        case Hotine_Oblique_Mercator:
+            scaleFactor = Double.parseDouble(words[9+offset]);
+            break;
+        case Stereographic:
+        case Transverse_Mercator_also_known_as_Gauss_Kruger:
+        case Transverse_Mercator_modified_for_Danish_System_34_Jylland_Fyn:
+        case Transverse_Mercator_modified_for_Danish_System_45_Bornholm:
+        case Transverse_Mercator_modified_for_Finnish_KKJ:
+        case Transverse_Mercator_modified_for_Sjaelland:
+            scaleFactor = Double.parseDouble(words[8+offset]);
+            break;
+        }
+        
+        // False Easting/Northing
+        switch (proj) {
+        case Albers_Equal_Area_Conic:
+        case Equidistant_Conic_also_known_as_Simple_Conic:
+        case Hotine_Oblique_Mercator:
+        case Lambert_Conformal_Conic:
+        case Lambert_Conformal_Conic_modified_for_Belgium_1972:
+            falseEasting = Double.parseDouble(words[10+offset]);
+            falseNorthing = Double.parseDouble(words[11+offset]);
+            break;
+        case Stereographic:
+        case Transverse_Mercator_also_known_as_Gauss_Kruger:
+        case Transverse_Mercator_modified_for_Danish_System_34_Jylland_Fyn:
+        case Transverse_Mercator_modified_for_Danish_System_45_Bornholm:
+        case Transverse_Mercator_modified_for_Finnish_KKJ:
+        case Transverse_Mercator_modified_for_Sjaelland:
+            falseEasting = Double.parseDouble(words[9+offset]);
+            falseNorthing = Double.parseDouble(words[10+offset]);
+            break;
+        case New_Zealand_Map_Grid:
+        case Swiss_Oblique_Mercator:
+        case Polyconic:
+            falseEasting = Double.parseDouble(words[8+offset]);
+            falseNorthing = Double.parseDouble(words[9+offset]);
+            break;
+        }
+                                    
+        // Range
+        switch (proj) {
+        case Azimuthal_Equidistant_polar_aspect_only:
+        case Lambert_Azimuthal_Equal_Area_polar_aspect_only:
+            range = Double.parseDouble(words[8+offset]);
+        }
+
+        switch (proj) {
+        case Lambert_Conformal_Conic:
+            if ((datum == Geodetic_Reference_System_1980_GRS_80 || datum == Custom) && equals(originLon, 3.0)) {
+                // This sounds good for Lambert 93 or Lambert CC 9
+                if (equals(originLat, 46.5) && equals(stdP1, 44.0) && equals(stdP2, 49.0) && equals(falseEasting, 700000.0) && equals(falseNorthing, 6600000.0)) {
+                    josmProj = Projections.getProjectionByCode("EPSG:2154"); // Lambert 93
+                } else if (equals(falseEasting, 1700000.0)) {
+                    for (int i=0; josmProj == null && i<9; i++) {
+                        if (equals(originLat, 42.0+i) && equals(stdP1, 41.25+i) && equals(stdP2, 42.75+i) && equals(falseNorthing, (i+1)*1000000.0 + 200000.0)) {
+                            josmProj = Projections.getProjectionByCode("EPSG:"+Integer.toString(3942 + i)); // LambertCC9Zones
+                        }
+                    }
+                }
+            }
+            break;
+        default:
+            // TODO
+            Main.warn("TODO proj: "+line);
+        }
+        
+        // TODO: handle cases with Affine declaration
+        int index = parseAffineUnits(words);
+
+        // handle cases with Bounds declaration
+        parseBounds(words, index);
+    }
+
+    private void parseCoordSysSyntax2(String[] words) {
+        // handle cases with Affine declaration
+        int index = parseAffineUnits(words);
+        
+        // FIXME: no idea what projection has to be used for real with "non-earth" mode...
+        josmProj = Projections.getProjectionByCode("EPSG:4326"); // WGS 84
+        
+        units = words[index+1];
+        
+        parseBounds(words, index+2);
+    }
+    
+    private int parseAffineUnits(String[] words) {
+        // TODO: handle affine units
+        return 2+0;
+    }
+
+    private void parseBounds(String[] words, int index) {
+        if (index < words.length && "Bounds".equals(words[index])) {
+            // Useless parenthesis... "(minx, miny) (maxx, maxy)"
+            minx = Double.parseDouble(words[index+1].substring(1));
+            miny = Double.parseDouble(words[index+2].substring(0, words[index+2].length()-1));
+            maxx = Double.parseDouble(words[index+3].substring(1));
+            maxy = Double.parseDouble(words[index+4].substring(0, words[index+4].length()-1));
+            if (Main.isTraceEnabled()) {
+                Main.trace(Arrays.toString(words) + " -> "+minx+","+miny+","+maxx+","+maxy);
+            }
+        }
+    }
+
+    private void parseCoordSys(String[] words) {
+        for (int i = 0; i<words.length; i++) {
+            words[i] = words[i].replace(",", "");
+        }
+        switch (words[1].toLowerCase()) {
+        case "earth":
+            parseCoordSysSyntax1(words);
+            break;
+        case "nonearth":
+            parseCoordSysSyntax2(words);
+            break;
+        case "layout":
+        case "table":
+        case "window":
+            // TODO: support Layout, Table, Window clauses 
+            Main.warn("TODO: "+line);
+            break;
+        default:
+            Main.warn("Line "+lineNum+". Invalid CoordSys clause: "+line);
+        }
+    }
+
+    private void parseTransform(String[] words) {
+        // TODO
+        Main.warn("TODO Transform: "+line);
+    }
+
+    @Override
+    protected void parseColumns(String[] words) {
+        super.parseColumns(words);
+        state = State.READING_COLUMNS;
+    }
+
+    private void parseData(String[] words) {
+        if (ds == null) {
+            ds = new DataSet();
+        }
+    }
+    
+    private void parsePoint(String[] words) throws IOException {
+        readAttributes(createNode(words[1], words[2]));
+    }
+
+    private void parseLine(String[] words) throws IOException {
+        Way line = new Way();
+        ds.addPrimitive(line);
+        readAttributes(line);
+        line.addNode(createNode(words[1], words[2]));
+        line.addNode(createNode(words[3], words[4]));
+    }
+    
+    private void parsePLine(String[] words) throws IOException {
+        if (words.length > 2) {
+            // TODO: pline with multiple sections
+            polyline = new Way();
+            ds.addPrimitive(polyline);
+            readAttributes(polyline);
+            numpts = Integer.parseInt(words[1]); // Not described in PDF but found in real files: PLINE XX, with XX = numpoints
+            state = State.READING_POINTS;
+        } else {
+            numpts = -1;
+            state = State.START_POLYLINE;
+        }
+    }
+
+    private void parseRegion(String[] words) throws IOException {
+        region = new Relation();
+        region.put("type", "multipolygon");
+        ds.addPrimitive(region);
+        readAttributes(region);
+        numpolygons = Integer.parseInt(words[1]);
+        state = State.START_POLYGON;
+    }
+
+    private void parseArc(String[] words) {
+        // TODO
+        Main.warn("TODO Arc: "+line);
+    }
+
+    private void parseText(String[] words) {
+        // TODO
+        Main.warn("TODO Text: "+line);
+    }
+
+    private void parseRect(String[] words) {
+        // TODO
+        Main.warn("TODO Rect: "+line);
+    }
+
+    private void parseRoundRect(String[] words) {
+        // TODO
+        Main.warn("TODO RoundRect: "+line);
+    }
+
+    private void parseEllipse(String[] words) {
+        // TODO
+        Main.warn("TODO Ellipse: "+line);
+    }
+
+    private DataSet parse(InputStream in, File file, ProgressMonitor instance, Charset charset) throws IOException {
+        try {
+            headerReader = new BufferedReader(new InputStreamReader(in, charset));
+            midReader = getDataReader(file, ".mid", charset);
+            parseHeader();
+            if (midReader != null) {
+                midReader.close();
+            }
+            return ds;
+        } catch (UnsupportedEncodingException e) {
+            throw new IOException(e);
+        }
+    }
+
+    @Override
+    protected void parseHeaderLine(String[] words) throws IOException {
+        if (words[0].equalsIgnoreCase("Version")) {
+            parseVersion(words);
+        } else if (words[0].equalsIgnoreCase("Charset")) {
+            parseCharset(words);
+        } else if (words[0].equalsIgnoreCase("Delimiter")) {
+            parseDelimiter(words);
+        } else if (words[0].equalsIgnoreCase("Unique")) {
+            parseUnique(words);
+        } else if (words[0].equalsIgnoreCase("Index")) {
+            parseIndex(words);
+        } else if (words[0].equalsIgnoreCase("CoordSys")) {
+            parseCoordSys(words);
+        } else if (words[0].equalsIgnoreCase("Transform")) {
+            parseTransform(words);
+        } else if (words[0].equalsIgnoreCase("Columns")) {
+            parseColumns(words);
+        } else if (words[0].equalsIgnoreCase("Data")) {
+            parseData(words);
+        } else if (ds != null) {
+            if (state == State.START_POLYGON) {
+                numpts = Integer.parseInt(words[0]);
+                polygon = new Way();
+                ds.addPrimitive(polygon);
+                region.addMember(new RelationMember("outer", polygon));
+                state = State.READING_POINTS;
+                
+            } else if (state == State.START_POLYLINE) {
+                numpts = Integer.parseInt(words[0]);
+                polyline = new Way();
+                ds.addPrimitive(polyline);
+                readAttributes(polyline);
+                state = State.READING_POINTS;
+                
+            } else if (state == State.READING_POINTS && numpts > 0) {
+                if (josmProj != null) {
+                    node = createNode(words[0], words[1]);
+                    if (polygon != null) {
+                        polygon.addNode(node);
+                    } else if (polyline != null) {
+                        polyline.addNode(node);
+                    }
+                }
+                if (--numpts == 0) {
+                    if (numpolygons > -1) {
+                        if (--numpolygons > 0) {
+                            state = State.START_POLYGON;
+                        } else {
+                            state = State.END_POLYGON;
+                            polygon = null;
+                        }
+                    } else if (polyline != null) {
+                        state = State.UNKNOWN;
+                        polyline = null;
+                    }
+                }
+            } else if (words[0].equalsIgnoreCase("Point")) {
+                parsePoint(words);
+            } else if (words[0].equalsIgnoreCase("Line")) {
+                parseLine(words);
+            } else if (words[0].equalsIgnoreCase("PLine")) {
+                parsePLine(words);
+            } else if (words[0].equalsIgnoreCase("Region")) {
+                parseRegion(words);
+            } else if (words[0].equalsIgnoreCase("Arc")) {
+                parseArc(words);
+            } else if (words[0].equalsIgnoreCase("Text")) {
+                parseText(words);
+            } else if (words[0].equalsIgnoreCase("Rect")) {
+                parseRect(words);
+            } else if (words[0].equalsIgnoreCase("RoundRect")) {
+                parseRoundRect(words);
+            } else if (words[0].equalsIgnoreCase("Ellipse")) {
+                parseEllipse(words);
+            } else if (words[0].equalsIgnoreCase("Pen")) {
+                // Do nothing
+            } else if (words[0].equalsIgnoreCase("Brush")) {
+                // Do nothing
+            } else if (words[0].equalsIgnoreCase("Center")) {
+                // Do nothing
+            } else if (words[0].equalsIgnoreCase("Symbol")) {
+                // Do nothing
+            } else if (words[0].equalsIgnoreCase("Font")) {
+                // Do nothing
+            } else if (!words[0].isEmpty()) {
+                Main.warn("Line "+lineNum+". Unknown clause in data section: "+line);
+            }
+        } else if (state == State.READING_COLUMNS && numcolumns > 0) {
+            columns.add(words[0]);
+            if (--numcolumns == 0) {
+                state = State.UNKNOWN;
+            }
+        } else if (!line.isEmpty()) {
+            Main.warn("Line "+lineNum+". Unknown clause in header: "+line);
+        }
+    }
+    
+    protected void readAttributes(OsmPrimitive p) throws IOException {
+        if (midReader != null) { 
+            String midLine = midReader.readLine();
+            if (midLine != null) {
+                String[] fields = OdUtils.stripQuotesAndExtraChars(midLine.split(delimiter.toString()), delimiter.toString());
+                if (columns.size() != fields.length) {
+                    Main.error("Incoherence between MID and MIF files ("+columns.size()+" columns vs "+fields.length+" fields)");
+                }
+                for (int i=0; i<Math.min(columns.size(), fields.length); i++) {
+                    String field = fields[i].trim();
+                    /*if (field.startsWith("\"") && field.endsWith("\"")) {
+                        field = fields[i].substring(fields[i].indexOf('"')+1, fields[i].lastIndexOf('"'));
+                    }*/
+                    if (!field.isEmpty()) {
+                        p.put(columns.get(i), field);
+                    }
+                }
+            }
+        }
+    }
+    
+    protected final Node createNode(String x, String y) {
+        Node node = new Node(josmProj.eastNorth2latlon(new EastNorth(Double.parseDouble(x), Double.parseDouble(y))));
+        ds.addPrimitive(node);
+        return node;
+    }
+    
+    /** Compare two doubles within a default epsilon */
+    public static boolean equals(Double a, Double b) {
+        if (a==b) return true;
+        // If the difference is less than epsilon, treat as equal.
+        return Math.abs(a - b) < 0.0000001;
+    }
 }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifTabImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifTabImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifTabImporter.java	(revision 30563)
@@ -1,15 +1,22 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io.geographic;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class MifTabImporter extends AbstractImporter {
 	
+    public static final ExtensionFileFilter MIF_TAB_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.MIF_EXT+","+OdConstants.TAB_EXT, OdConstants.MIF_EXT, tr("MapInfo files") + " (*."+OdConstants.MIF_EXT+",*."+OdConstants.TAB_EXT+")");
+
     public MifTabImporter() {
         super(MIF_TAB_FILE_FILTER);
@@ -20,5 +27,5 @@
 			throws IllegalDataException {
 		try {
-			if (file.getName().toLowerCase().endsWith(MIF_EXT)) {
+			if (file.getName().toLowerCase().endsWith(OdConstants.MIF_EXT)) {
 				return MifReader.parseDataSet(in, file, handler, instance);
 			} else {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpImporter.java	(revision 30563)
@@ -1,15 +1,22 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io.geographic;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class ShpImporter extends AbstractImporter {
 	
+    public static final ExtensionFileFilter SHP_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.SHP_EXT, OdConstants.SHP_EXT, tr("Shapefiles") + " (*."+OdConstants.SHP_EXT+")");
+
     public ShpImporter() {
         super(SHP_FILE_FILTER);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/TabReader.java	(revision 30563)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+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.tabular.SpreadSheetHandler;
@@ -35,5 +36,5 @@
 	public static DataSet parseDataSet(InputStream in, File file,
 			AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
-		return new TabReader(handler).parse(in, file, instance, Charset.forName(ISO8859_15));
+		return new TabReader(handler).parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
 	}
 		
@@ -57,5 +58,5 @@
 				return null;
 			}
-        	List<String> result = new ArrayList<String>();
+        	List<String> result = new ArrayList<>();
 			Row row = dbfReader.readRow();
         	for (int i=0; i<columns.size(); i++) {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvImporter.java	(revision 30563)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.BufferedReader;
@@ -8,10 +10,15 @@
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class CsvImporter extends AbstractImporter {
+    
+    public static final ExtensionFileFilter CSV_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.CSV_EXT, OdConstants.CSV_EXT, tr("CSV files") + " (*."+OdConstants.CSV_EXT+")");
     
     public static final String COLOMBUS_HEADER = "INDEX,TAG,DATE,TIME,LATITUDE N/S,LONGITUDE E/W,HEIGHT,SPEED,HEADING,FIX MODE,VALID,PDOP,HDOP,VDOP,VOX";
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/CsvReader.java	(revision 30563)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
@@ -27,5 +28,5 @@
 	public CsvReader(CsvHandler handler, String defaultSep) {
 		super(handler);
-		this.charset = handler != null && handler.getCharset() != null ? handler.getCharset() : Charset.forName(UTF8);
+		this.charset = handler != null && handler.getCharset() != null ? handler.getCharset() : Charset.forName(OdConstants.UTF8);
 		this.sep = handler != null && handler.getSeparator() != null ? handler.getSeparator() : defaultSep;
 	}
@@ -40,5 +41,5 @@
 			return csvReader.parse(in, instance);
 		} catch (IllegalArgumentException e) {
-			if (csvHandler == null || (csvHandler.getSeparator() != null && csvHandler.getSeparator().equals(";"))) {
+			if (csvHandler == null || csvHandler.getSeparator() == null || ";".equals(csvHandler.getSeparator())) {
 				// If default sep has been used, try comma
 				System.out.println(e.getMessage());
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsDocument.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsDocument.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsDocument.java	(revision 30563)
@@ -11,10 +11,9 @@
 import org.jopendocument.io.SaxContentUnmarshaller;
 import org.jopendocument.model.OpenDocument;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.XMLReaderFactory;
 
-public class OdsDocument extends OpenDocument implements OdConstants {
+public class OdsDocument extends OpenDocument {
 
 	public OdsDocument(InputStream in) {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/OdsImporter.java	(revision 30563)
@@ -1,15 +1,22 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class OdsImporter extends AbstractImporter {
 	
+    public static final ExtensionFileFilter ODS_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.ODS_EXT, OdConstants.ODS_EXT, tr("ODS files") + " (*."+OdConstants.ODS_EXT+")");
+    
     public OdsImporter() {
         super(ODS_FILE_FILTER);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 30563)
@@ -4,4 +4,6 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Component;
+import java.awt.GraphicsEnvironment;
 import java.io.IOException;
 import java.io.InputStream;
@@ -27,5 +29,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionPatterns;
 
-public abstract class SpreadSheetReader extends AbstractReader implements OdConstants {
+public abstract class SpreadSheetReader extends AbstractReader {
 	
 	private static final NumberFormat formatFrance = NumberFormat.getInstance(Locale.FRANCE);
@@ -65,5 +67,6 @@
 			return xCol > -1 && yCol > -1;
 		}
-        @Override public String toString() {
+        @Override
+        public String toString() {
             return "CoordinateColumns [proj=" + proj + ", xCol=" + xCol + ", yCol=" + yCol + "]";
         }
@@ -86,6 +89,8 @@
         }
 
-        @Override public void run() {
-            ProjectionChooser dialog = (ProjectionChooser) new ProjectionChooser(progressMonitor.getWindowParent()).showDialog();
+        @Override
+        public void run() {
+            Component parent = progressMonitor == null ? Main.parent : progressMonitor.getWindowParent();
+            ProjectionChooser dialog = (ProjectionChooser) new ProjectionChooser(parent).showDialog();
             if (dialog.getValue() == 1) {
                 proj = dialog.getProjection();
@@ -100,5 +105,5 @@
 		
 		for (int i = 0; i<header.length; i++) {
-			for (ProjectionPatterns pp : PROJECTIONS) {
+			for (ProjectionPatterns pp : OdConstants.PROJECTIONS) {
 			    List<CoordinateColumns> columns = projColumns.get(pp);
 			    if (columns == null) {
@@ -144,4 +149,7 @@
 		} else if (!columns.isEmpty()) {
 			if (!handlerOK) {
+                if (GraphicsEnvironment.isHeadless()) {
+                    throw new IllegalArgumentException("No valid coordinates have been found and cannot prompt user in headless mode.");
+			    }
 				// TODO: filter proposed projections with min/max values ?
 			    ChooserLauncher launcher = new ChooserLauncher(progressMonitor);
@@ -233,5 +241,5 @@
     			        firstNode = n;
     			    }
-    			    if (n == firstNode || n.getCoor().greatCircleDistance(firstNode.getCoor()) > Main.pref.getDouble(PREF_TOLERANCE, DEFAULT_TOLERANCE)) {
+    			    if (n == firstNode || n.getCoor().greatCircleDistance(firstNode.getCoor()) > Main.pref.getDouble(OdConstants.PREF_TOLERANCE, OdConstants.DEFAULT_TOLERANCE)) {
     			        ds.addPrimitive(n);
     			    } else {
@@ -240,5 +248,5 @@
     			}
 			}
-			if (handler != null && !Main.pref.getBoolean(PREF_RAWDATA)) {
+			if (handler != null && !Main.pref.getBoolean(OdConstants.PREF_RAWDATA)) {
 			    handler.nodesAdded(ds, nodes, header, lineNumber);
 			}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/XlsImporter.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/XlsImporter.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/XlsImporter.java	(revision 30563)
@@ -1,15 +1,22 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.opendata.core.io.tabular;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.io.AbstractImporter;
 
 public class XlsImporter extends AbstractImporter {
 	
+    public static final ExtensionFileFilter XLS_FILE_FILTER = new ExtensionFileFilter(
+            OdConstants.XLS_EXT, OdConstants.XLS_EXT, tr("XLS files") + " (*."+OdConstants.XLS_EXT+")");
+    
     public XlsImporter() {
         super(XLS_FILE_FILTER);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDataLayer.java	(revision 30563)
@@ -28,5 +28,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
 
-public class OdDataLayer extends OsmDataLayer implements OdConstants, OdLayer, LayerChangeListener {
+public class OdDataLayer extends OsmDataLayer implements OdLayer, LayerChangeListener {
 
 	public OdDiffLayer diffLayer;
@@ -52,5 +52,5 @@
 	
     @Override public Icon getBaseIcon() {
-    	return OdUtils.getImageIcon(handler != null ? handler.getDataLayerIconName() : ICON_CORE_16);
+    	return OdUtils.getImageIcon(handler != null ? handler.getDataLayerIconName() : OdConstants.ICON_CORE_16);
     }
 
@@ -133,5 +133,5 @@
 			}
 			if (this.handler.getWikiURL() != null) { 
-				result.add(new OpenLinkAction(this.handler.getWikiURL(), ICON_OSM_24, 
+				result.add(new OpenLinkAction(this.handler.getWikiURL(), OdConstants.ICON_OSM_24, 
 						tr("View OSM Wiki page"), tr("Launch browser to the OSM Wiki page of the selected data set")));
 			}
@@ -147,9 +147,9 @@
 				License lic = this.handler.getLicense();
 				if (lic.getURL() != null && lic.getURL().getProtocol().startsWith("http")) {
-					result.add(new OpenLinkAction(lic.getURL(), ICON_AGREEMENT_24, 
+					result.add(new OpenLinkAction(lic.getURL(), OdConstants.ICON_AGREEMENT_24, 
 							tr("View License"), tr("Launch browser to the license page of the selected data set")));
 				}
 				if (lic.getSummaryURL() != null && lic.getSummaryURL().getProtocol().startsWith("http")) {
-					result.add(new OpenLinkAction(lic.getSummaryURL(), ICON_AGREEMENT_24, 
+					result.add(new OpenLinkAction(lic.getSummaryURL(), OdConstants.ICON_AGREEMENT_24, 
 							tr("View License (summary)"), tr("Launch browser to the summary license page of the selected data set")));
 				}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDiffLayer.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDiffLayer.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/layers/OdDiffLayer.java	(revision 30563)
@@ -20,5 +20,5 @@
 import org.openstreetmap.josm.tools.Pair;
 
-public class OdDiffLayer extends Layer implements OdLayer, OdConstants {
+public class OdDiffLayer extends Layer implements OdLayer {
 
 	private final OdDataLayer dataLayer;
@@ -62,5 +62,5 @@
 	
 	private OsmPrimitive findPrimitiveAt(DataSet dataSet, OsmPrimitive source) {
-		double maxDistance = Main.pref.getDouble(PREF_MAXDISTANCE, DEFAULT_MAXDISTANCE);
+		double maxDistance = Main.pref.getDouble(OdConstants.PREF_MAXDISTANCE, OdConstants.DEFAULT_MAXDISTANCE);
 		//List<OsmPrimitive> samePrimitives = new ArrayList<OsmPrimitive>();
 		OsmPrimitive nearestSamePrimitive = null;
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/LOOL.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/LOOL.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/LOOL.java	(revision 30563)
@@ -5,12 +5,12 @@
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
 
-public class LOOL extends License implements OdConstants {
+public class LOOL extends License {
 	
     //public static final String URL_FR = "http://www.data.gouv.fr/Licence-Ouverte-Open-Licence";
     
 	public LOOL() {
-		setIcon(OdUtils.getImageIcon(ICON_LOOL_48, true));
-		setURL(LOOL.class.getResource(RESOURCE_PATH+"Licence-Ouverte-Open-Licence-ENG.rtf"), "en");
-		setURL(LOOL.class.getResource(RESOURCE_PATH+"Licence-Ouverte-Open-Licence.rtf"), "fr");
+		setIcon(OdUtils.getImageIcon(OdConstants.ICON_LOOL_48, true));
+		setURL(LOOL.class.getResource(OdConstants.RESOURCE_PATH+"Licence-Ouverte-Open-Licence-ENG.rtf"), "en");
+		setURL(LOOL.class.getResource(OdConstants.RESOURCE_PATH+"Licence-Ouverte-Open-Licence.rtf"), "fr");
 	}
 }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/ODbL.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/ODbL.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/licenses/ODbL.java	(revision 30563)
@@ -4,5 +4,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 
-public class ODbL extends License implements OdConstants {
+public class ODbL extends License {
 	
     //public static final String URL            = "http://opendatacommons.org/licenses/odbl/1-0";
@@ -14,9 +14,9 @@
 		for (String lang : new String[]{"", "fr"}) {
 			if (lang.isEmpty()) {
-				setURL(ODbL.class.getResource(RESOURCE_PATH+"odbl-1.0.htm"));
-				setSummaryURL(ODbL.class.getResource(RESOURCE_PATH+"odbl-summary-1.0.htm"));
+				setURL(ODbL.class.getResource(OdConstants.RESOURCE_PATH+"odbl-1.0.htm"));
+				setSummaryURL(ODbL.class.getResource(OdConstants.RESOURCE_PATH+"odbl-summary-1.0.htm"));
 			} else {
-				setURL(ODbL.class.getResource(RESOURCE_PATH+"odbl-1.0-"+lang+".htm"), lang);
-				setSummaryURL(ODbL.class.getResource(RESOURCE_PATH+"odbl-summary-1.0-"+lang+".htm"), lang);
+				setURL(ODbL.class.getResource(OdConstants.RESOURCE_PATH+"odbl-1.0-"+lang+".htm"), lang);
+				setSummaryURL(ODbL.class.getResource(OdConstants.RESOURCE_PATH+"odbl-summary-1.0-"+lang+".htm"), lang);
 			}
 		}
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java	(revision 30563)
@@ -17,5 +17,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 
-public abstract class AbstractModule implements Module, OdConstants {
+public abstract class AbstractModule implements Module {
 
 	protected final List<Class<? extends AbstractDataSetHandler>> handlers = new ArrayList<>();
@@ -52,9 +52,9 @@
 				try {
 					// Copy style sheet to disk to allow JOSM to load it at startup (even making the plugin "early" does not allow it)
-					String path = OdPlugin.getInstance().getResourcesDirectory()+File.separator+src.url.replace(PROTO_RSRC, "").replace('/', File.separatorChar);
+					String path = OdPlugin.getInstance().getResourcesDirectory()+File.separator+src.url.replace(OdConstants.PROTO_RSRC, "").replace('/', File.separatorChar);
 					
 					int n = 0;
 					byte[] buffer = new byte[4096];
-					InputStream in = getClass().getResourceAsStream(src.url.substring(PROTO_RSRC.length()-1));
+					InputStream in = getClass().getResourceAsStream(src.url.substring(OdConstants.PROTO_RSRC.length()-1));
 					new File(path.substring(0, path.lastIndexOf(File.separatorChar))).mkdirs();
 					FileOutputStream out = new FileOutputStream(path);
@@ -66,5 +66,5 @@
 
 					// Add source pointing to the local file
-					src.url = PROTO_FILE+path;
+					src.url = OdConstants.PROTO_FILE+path;
 					sources.add(src);
 				} catch (IOException e) {
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleHandler.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleHandler.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleHandler.java	(revision 30563)
@@ -56,5 +56,5 @@
  *
  */
-public class ModuleHandler implements OdConstants {
+public class ModuleHandler {
 
     /**
@@ -251,5 +251,5 @@
         }
         if (msg != null && confirmDisableModule(parent, msg, module.name)) {
-            Main.pref.removeFromCollection(PREF_MODULES, module.name);
+            Main.pref.removeFromCollection(OdConstants.PREF_MODULES, module.name);
         }
     }
@@ -359,7 +359,7 @@
     public static List<ModuleInformation> buildListOfModulesToLoad(Component parent) {
         Set<String> modules = new HashSet<>();
-        modules.addAll(Main.pref.getCollection(PREF_MODULES,  new LinkedList<String>()));
-        if (System.getProperty("josm."+PREF_MODULES) != null) {
-            modules.addAll(Arrays.asList(System.getProperty("josm."+PREF_MODULES).split(",")));
+        modules.addAll(Main.pref.getCollection(OdConstants.PREF_MODULES,  new LinkedList<String>()));
+        if (System.getProperty("josm."+OdConstants.PREF_MODULES) != null) {
+            modules.addAll(Arrays.asList(System.getProperty("josm."+OdConstants.PREF_MODULES).split(",")));
         }
         Map<String, ModuleInformation> infos = loadLocallyAvailableModuleInformation(null);
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleInformation.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleInformation.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ModuleInformation.java	(revision 30563)
@@ -34,5 +34,5 @@
  * without the need of loading any class from the module jar file.
  */
-public class ModuleInformation implements OdConstants {
+public class ModuleInformation {
     public File file = null;
     public String name = null;
@@ -218,5 +218,5 @@
             sb.append(" <a href=\"").append(link).append("\">").append(tr("More info...")).append("</a>");
         }
-        if (downloadlink != null && !downloadlink.startsWith(OSM_SITE+"dist/")) {
+        if (downloadlink != null && !downloadlink.startsWith(OdConstants.OSM_SITE+"dist/")) {
             sb.append("<p>&nbsp;</p><p>"+tr("<b>Module provided by an external source:</b> {0}", downloadlink)+"</p>");
         }
@@ -347,5 +347,5 @@
     public ImageIcon getScaledIcon() {
         if (icon == null)
-            return OdUtils.getImageIcon(ICON_EMPTY_24);
+            return OdUtils.getImageIcon(OdConstants.ICON_EMPTY_24);
         return new ImageIcon(icon.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH));
     }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadRemoteModuleInformationTask.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadRemoteModuleInformationTask.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/ReadRemoteModuleInformationTask.java	(revision 30563)
@@ -31,5 +31,4 @@
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.plugins.opendata.OdPlugin;
-import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.xml.sax.SAXException;
@@ -39,5 +38,5 @@
  *
  */
-public class ReadRemoteModuleInformationTask extends PleaseWaitRunnable implements OdConstants {
+public class ReadRemoteModuleInformationTask extends PleaseWaitRunnable {
 
     private Collection<String> sites;
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/NamesFrUtils.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/NamesFrUtils.java	(revision 30532)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/util/NamesFrUtils.java	(revision 30563)
@@ -15,5 +15,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.datasets.SimpleDataSetHandler;
 
-public abstract class NamesFrUtils implements OdConstants {
+public abstract class NamesFrUtils {
 	
 	private static Map<String, String> dictionary = initDictionary();
@@ -34,5 +34,5 @@
 		try {
 			BufferedReader reader = new BufferedReader(new InputStreamReader(
-					SimpleDataSetHandler.class.getResourceAsStream(DICTIONARY_FR), UTF8));
+					SimpleDataSetHandler.class.getResourceAsStream(OdConstants.DICTIONARY_FR), OdConstants.UTF8));
 			String line = reader.readLine(); // Skip first line
 			while ((line = reader.readLine()) != null) {
