Index: /applications/editors/josm/plugins/cadastre-fr/.classpath
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/.classpath	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/.classpath	(revision 34458)
@@ -2,5 +2,9 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="test/unit"/>
+	<classpathentry kind="src" output="bintest" path="test/unit">
+		<attributes>
+			<attribute name="test" value="true"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
Index: /applications/editors/josm/plugins/cadastre-fr/build.xml
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/build.xml	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/build.xml	(revision 34458)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="Changed constructor for Plugin"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="13927"/>
+    <property name="plugin.main.version" value="14153"/>
     
     <!-- Configure these properties (replace "..." accordingly).
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/CadastrePlugin.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/CadastrePlugin.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/CadastrePlugin.java	(revision 34458)
@@ -23,5 +23,4 @@
 import javax.swing.KeyStroke;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.actions.JosmAction;
@@ -29,4 +28,5 @@
 import org.openstreetmap.josm.data.projection.AbstractProjection;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.IconToggleButton;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -57,4 +57,5 @@
 import org.openstreetmap.josm.plugins.fr.cadastre.session.CadastreSessionImporter;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.WMSLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -153,5 +154,5 @@
  * <br>                - move the grabber from CadastrPlugin singleton to each wmsLayer instance to allow grabbing
  *                       of multiple municipalities in parallel.
- * <br>2.2 01-Jul-2011 - replace deprecated Main.proj by newest Main.getProjection()
+ * <br>2.2 01-Jul-2011 - replace deprecated Main.proj by newest ProjectionRegistry.getProjection()
  * <br>                - fix list of raster images (Feuilles) parsing failing after a Cadastre server change/maintenance
  * <br>2.3 11-Jan-2013 - add various improvements from Don-Vip (Vincent Privat) trac #8175, #8229 and #5626.
@@ -239,8 +240,8 @@
 
     private static void initCacheDir() {
-        if (Main.pref.get("cadastrewms.cacheDir").isEmpty()) {
-            cacheDir = new File(Main.pref.getDirs().getCacheDirectory(true), "cadastrewms").getAbsolutePath();
+        if (Config.getPref().get("cadastrewms.cacheDir").isEmpty()) {
+            cacheDir = new File(Config.getDirs().getCacheDirectory(true), "cadastrewms").getAbsolutePath();
         } else {
-            cacheDir = Main.pref.get("cadastrewms.cacheDir");
+            cacheDir = Config.getPref().get("cadastrewms.cacheDir");
         }
         if (cacheDir.charAt(cacheDir.length()-1) != File.separatorChar)
@@ -267,5 +268,5 @@
                 @Override
                 public void actionPerformed(ActionEvent ev) {
-                    Main.pref.putBoolean("cadastrewms.autosourcing", menuSource.isSelected());
+                    Config.getPref().putBoolean("cadastrewms.autosourcing", menuSource.isSelected());
                     autoSourcing = menuSource.isSelected();
                 }
@@ -285,5 +286,5 @@
             //cadastreJMenu.add(menuResetCookie); not required any more
             //cadastreJMenu.add(menuLambertZone);
-            //if (Main.pref.getBoolean("cadastrewms.buildingsMenu", false))
+            //if (Config.getPref().getBoolean("cadastrewms.buildingsMenu", false))
             //    cadastreJMenu.add(menuActionBuildings);
             cadastreJMenu.add(menuLoadFromCache);
@@ -297,15 +298,15 @@
     public static void refreshConfiguration() {
         source = checkSourceMillesime();
-        autoSourcing = Main.pref.getBoolean("cadastrewms.autosourcing", true);
-        alterColors = Main.pref.getBoolean("cadastrewms.alterColors");
-        drawBoundaries = Main.pref.getBoolean("cadastrewms.drawBoundaries", false);
+        autoSourcing = Config.getPref().getBoolean("cadastrewms.autosourcing", true);
+        alterColors = Config.getPref().getBoolean("cadastrewms.alterColors");
+        drawBoundaries = Config.getPref().getBoolean("cadastrewms.drawBoundaries", false);
         if (alterColors) {
-            backgroundTransparent = Main.pref.getBoolean("cadastrewms.backgroundTransparent");
-            transparency = Float.parseFloat(Main.pref.get("cadastrewms.brightness", "1.0f"));
+            backgroundTransparent = Config.getPref().getBoolean("cadastrewms.backgroundTransparent");
+            transparency = Float.parseFloat(Config.getPref().get("cadastrewms.brightness", "1.0f"));
         } else {
             backgroundTransparent = false;
             transparency = 1.0f;
         }
-        String currentResolution = Main.pref.get("cadastrewms.resolution", "high");
+        String currentResolution = Config.getPref().get("cadastrewms.resolution", "high");
         if (currentResolution.equals("high")) {
             imageWidth = 1000; imageHeight = 800;
@@ -323,45 +324,45 @@
         grabStyles = "";
         int countLayers = 0;
-        if (Main.pref.getBoolean("cadastrewms.layerWater", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerWater", true)) {
             grabLayers += LAYER_WATER + ",";
             grabStyles += STYLE_WATER + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerBuilding", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerBuilding", true)) {
             grabLayers += LAYER_BULDINGS + ",";
             grabStyles += STYLE_BUILDING + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerSymbol", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerSymbol", true)) {
             grabLayers += LAYER_SYMBOL + ",";
             grabStyles += STYLE_SYMBOL + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerParcel", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerParcel", true)) {
             grabLayers += LAYER_PARCELS + ",";
             grabStyles += STYLE_PARCELS + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerNumero", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerNumero", true)) {
             grabLayers += LAYER_NUMERO + ",";
             grabStyles += STYLE_NUMERO + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerLabel", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerLabel", true)) {
             grabLayers += LAYER_LABEL + ",";
             grabStyles += STYLE_LABEL + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerLieudit", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerLieudit", true)) {
             grabLayers += LAYER_LIEUDIT + ",";
             grabStyles += STYLE_LIEUDIT + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerSection", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerSection", true)) {
             grabLayers += LAYER_SECTION + ",";
             grabStyles += STYLE_SECTION + ",";
             countLayers++;
         }
-        if (Main.pref.getBoolean("cadastrewms.layerCommune", true)) {
+        if (Config.getPref().getBoolean("cadastrewms.layerCommune", true)) {
             grabLayers += LAYER_COMMUNE + ",";
             grabStyles += STYLE_COMMUNE + ",";
@@ -372,8 +373,8 @@
             grabStyles = grabStyles.substring(0, grabStyles.length()-1);
         } else {
-            JOptionPane.showMessageDialog(Main.parent, tr("Please enable at least two WMS layers in the cadastre-fr "
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Please enable at least two WMS layers in the cadastre-fr "
                     + "plugin configuration.\nLayers ''Building'' and ''Parcel'' added by default."));
-            Main.pref.putBoolean("cadastrewms.layerBuilding", true);
-            Main.pref.putBoolean("cadastrewms.layerParcel", true);
+            Config.getPref().putBoolean("cadastrewms.layerBuilding", true);
+            Config.getPref().putBoolean("cadastrewms.layerParcel", true);
             grabLayers += LAYER_BULDINGS + "," + LAYER_PARCELS;
             grabStyles += STYLE_BUILDING + "," + STYLE_PARCELS;
@@ -416,15 +417,15 @@
 
     public static boolean isLambert() {
-        String code = Main.getProjection().toCode();
+        String code = ProjectionRegistry.getProjection().toCode();
         return Arrays.asList(ProjectionPreference.lambert.allCodes()).contains(code);
     }
 
     public static boolean isUtm_france_dom() {
-        String code = Main.getProjection().toCode();
+        String code = ProjectionRegistry.getProjection().toCode();
         return Arrays.asList(ProjectionPreference.utm_france_dom.allCodes()).contains(code);
     }
 
     public static boolean isLambert_cc9() {
-        String code = Main.getProjection().toCode();
+        String code = ProjectionRegistry.getProjection().toCode();
         return Arrays.asList(ProjectionPreference.lambert_cc9.allCodes()).contains(code);
     }
@@ -436,5 +437,5 @@
     public static int getCadastreProjectionLayoutZone() {
         int zone = -1;
-        Projection proj = Main.getProjection();
+        Projection proj = ProjectionRegistry.getProjection();
         if (proj instanceof AbstractProjection) {
             Integer code = ((AbstractProjection) proj).getEpsgCode();
@@ -471,5 +472,5 @@
     // FIXME: this is a temporary solution.
     public static void prepareDialog(JDialog dialog) {
-        if (Main.pref.getBoolean("window-handling.option-pane-always-on-top", true)) {
+        if (Config.getPref().getBoolean("window-handling.option-pane-always-on-top", true)) {
             try {
                 dialog.setAlwaysOnTop(true);
@@ -506,5 +507,5 @@
     private static String checkSourceMillesime() {
         int currentYear = Calendar.getInstance().get(Calendar.YEAR);
-        String src = Main.pref.get("cadastrewms.source",
+        String src = Config.getPref().get("cadastrewms.source",
             "cadastre-dgi-fr source : Direction G\u00e9n\u00e9rale des Imp\u00f4ts - Cadastre. Mise \u00e0 jour : AAAA");
         String srcYear = src.substring(src.lastIndexOf(" ")+1);
@@ -518,5 +519,5 @@
             Logging.info("Replace source year "+srcYear+" by current year "+currentYear);
             src = src.substring(0, src.lastIndexOf(" ")+1)+currentYear;
-            Main.pref.put("cadastrewms.source", src);
+            Config.getPref().put("cadastrewms.source", src);
         }
         return src;
@@ -530,5 +531,5 @@
             @Override
             public void run() {
-                if (JOptionPane.showConfirmDialog(Main.parent,
+                if (JOptionPane.showConfirmDialog(MainApplication.getMainFrame(),
                         tr("To enable the cadastre WMS plugin, change\n"
                                 + "the current projection to one of the cadastre\n"
@@ -536,5 +537,5 @@
                                 tr("Change the current projection"), JOptionPane.OK_CANCEL_OPTION)
                     == JOptionPane.OK_OPTION) {
-                    PreferenceDialog p = new PreferenceDialog(Main.parent);
+                    PreferenceDialog p = new PreferenceDialog(MainApplication.getMainFrame());
                     p.selectPreferencesTabByClass(MapPreference.class);
                     p.getTabbedPane().getSetting(ProjectionPreference.class).selectProjection(ProjectionPreference.lambert_cc9);
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionBoundaries.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionBoundaries.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionBoundaries.java	(revision 34458)
@@ -8,6 +8,6 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.DownloadSVGTask;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.WMSLayer;
@@ -32,5 +32,5 @@
         if (wmsLayer != null) {
             if (wmsLayer.isRaster()) {
-                JOptionPane.showMessageDialog(Main.parent,
+                JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                         tr("Only on vectorized layers"), tr("Error"),
                         JOptionPane.ERROR_MESSAGE);
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionGrabPlanImage.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionGrabPlanImage.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionGrabPlanImage.java	(revision 34458)
@@ -10,5 +10,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -17,4 +16,5 @@
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.RasterImageGeoreferencer;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.WMSLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 public class MenuActionGrabPlanImage extends JosmAction implements Runnable {
@@ -45,5 +45,5 @@
         if (MainApplication.getLayerManager().containsLayer(wmsLayer))
             return;
-        JOptionPane.showMessageDialog(Main.parent, tr("Georeferencing interrupted"));
+        JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Georeferencing interrupted"));
         rasterImageGeoreferencer.actionInterrupted();
     }
@@ -87,5 +87,5 @@
             } else {
                 rasterImageGeoreferencer.addListener();
-                if (Main.pref.getBoolean("cadastrewms.noImageCropping", false) == false)
+                if (Config.getPref().getBoolean("cadastrewms.noImageCropping", false) == false)
                     rasterImageGeoreferencer.startCropping(wmsLayer);
                 else
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionLoadFromCache.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionLoadFromCache.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionLoadFromCache.java	(revision 34458)
@@ -11,5 +11,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -32,5 +31,6 @@
      */
     public MenuActionLoadFromCache() {
-        super(tr(name), "cadastre_small", tr("Load location from cache (only if cache is enabled)"), null, false, "cadastrefr/loadfromcache", true);
+        super(tr(name), "cadastre_small",
+                tr("Load location from cache (only if cache is enabled)"), null, false, "cadastrefr/loadfromcache", true);
     }
 
@@ -53,5 +53,6 @@
                             !(CadastrePlugin.isUtm_france_dom()))
                     || (ext.length() == 1) && !(CadastrePlugin.isLambert())) {
-                        JOptionPane.showMessageDialog(Main.parent, tr("{0} not allowed with the current projection", filename),
+                        JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
+                                tr("{0} not allowed with the current projection", filename),
                                 tr("Error"), JOptionPane.ERROR_MESSAGE);
                         continue;
@@ -67,5 +68,5 @@
                         if (cacheZone >= 0 && cacheZone <= 9) {
                             if (cacheZone != layoutZone) {
-                                JOptionPane.showMessageDialog(Main.parent,
+                                JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                                         tr("Cannot load cache {0} which is not compatible with current projection zone", filename),
                                         tr("Error"), JOptionPane.ERROR_MESSAGE);
@@ -75,5 +76,5 @@
                         }
                     } catch (NumberFormatException ex) {
-                        JOptionPane.showMessageDialog(Main.parent,
+                        JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                                 tr("Selected file {0} is not a cache file from this plugin (invalid extension)", filename),
                                 tr("Error"), JOptionPane.ERROR_MESSAGE);
@@ -84,5 +85,5 @@
                         for (Layer l : MainApplication.getLayerManager().getLayers()) {
                             if (l instanceof WMSLayer && l.getName().equals(location)) {
-                                JOptionPane.showMessageDialog(Main.parent,
+                                JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                                         tr("The location {0} is already on screen. Cache not loaded.", filename),
                                         tr("Error"), JOptionPane.ERROR_MESSAGE);
@@ -115,5 +116,5 @@
         fc.setAcceptAllFileFilterUsed(false);
 
-        int answer = fc.showOpenDialog(Main.parent);
+        int answer = fc.showOpenDialog(MainApplication.getMainFrame());
         if (answer != JFileChooser.APPROVE_OPTION)
             return null;
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionNewLocation.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionNewLocation.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionNewLocation.java	(revision 34458)
@@ -14,5 +14,4 @@
 import javax.swing.JTextField;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -21,4 +20,5 @@
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.DownloadWMSVectorImage;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.WMSLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -78,5 +78,5 @@
         JPanel p = new JPanel(new GridBagLayout());
         JLabel labelLocation = new JLabel(tr("Commune"));
-        final JTextField inputTown = new JTextField(Main.pref.get("cadastrewms.location"));
+        final JTextField inputTown = new JTextField(Config.getPref().get("cadastrewms.location"));
         inputTown.setToolTipText(tr("<html>Enter the town,village or city name.<br>"
                 + "Use the syntax and punctuation known by www.cadastre.gouv.fr .</html>"));
@@ -87,7 +87,7 @@
         }
         inputDepartement.setToolTipText(tr("<html>Departement number (optional)</html>"));
-        if (!Main.pref.get("cadastrewms.codeDepartement").equals("")) {
+        if (!Config.getPref().get("cadastrewms.codeDepartement").equals("")) {
             for (int i = 0; i < departements.length; i += 2) {
-                if (departements[i].equals(Main.pref.get("cadastrewms.codeDepartement")))
+                if (departements[i].equals(Config.getPref().get("cadastrewms.codeDepartement")))
                     inputDepartement.setSelectedIndex(i/2);
             }
@@ -107,5 +107,5 @@
             }
         };
-        pane.createDialog(Main.parent, tr("Add new layer")).setVisible(true);
+        pane.createDialog(MainApplication.getMainFrame(), tr("Add new layer")).setVisible(true);
         if (!Integer.valueOf(JOptionPane.OK_OPTION).equals(pane.getValue()))
             return null;
@@ -115,7 +115,7 @@
             location = inputTown.getText().toUpperCase();
             codeDepartement = departements[inputDepartement.getSelectedIndex()*2];
-            Main.pref.put("cadastrewms.location", location);
-            Main.pref.put("cadastrewms.codeCommune", codeCommune);
-            Main.pref.put("cadastrewms.codeDepartement", codeDepartement);
+            Config.getPref().put("cadastrewms.location", location);
+            Config.getPref().put("cadastrewms.codeCommune", codeCommune);
+            Config.getPref().put("cadastrewms.codeDepartement", codeDepartement);
             if (MainApplication.getMap() != null) {
                 for (Layer l : MainApplication.getLayerManager().getLayers()) {
@@ -131,5 +131,6 @@
             CadastrePlugin.addWMSLayer(wmsLayer);
             Logging.info("Add new layer with Location:" + inputTown.getText());
-        } else if (existingLayers != null && existingLayers.size() > 0 && MainApplication.getLayerManager().getActiveLayer() instanceof WMSLayer) {
+        } else if (existingLayers != null && existingLayers.size() > 0
+                && MainApplication.getLayerManager().getActiveLayer() instanceof WMSLayer) {
             wmsLayer = (WMSLayer) MainApplication.getLayerManager().getActiveLayer();
         }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionOpenPreferences.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionOpenPreferences.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionOpenPreferences.java	(revision 34458)
@@ -7,6 +7,6 @@
 import java.awt.event.ActionEvent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.preferences.PreferenceDialog;
 import org.openstreetmap.josm.plugins.fr.cadastre.preferences.CadastrePreferenceSetting;
@@ -26,5 +26,5 @@
     @Override
     public void actionPerformed(ActionEvent e) {
-        PreferenceDialog p = new PreferenceDialog(Main.parent);
+        PreferenceDialog p = new PreferenceDialog(MainApplication.getMainFrame());
         p.selectPreferencesTabByClass(CadastrePreferenceSetting.class);
         p.setVisible(true);
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionSaveRasterAs.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionSaveRasterAs.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/MenuActionSaveRasterAs.java	(revision 34458)
@@ -25,6 +25,6 @@
 import org.opengis.parameter.GeneralParameterValue;
 import org.opengis.parameter.ParameterValueGroup;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.WMSLayer;
 import org.openstreetmap.josm.tools.Logging;
@@ -87,5 +87,5 @@
         fc.addChoosableFileFilter(filtrePng);
         fc.setFileFilter(filtreTiff);
-        int returnVal = fc.showSaveDialog(Main.parent);
+        int returnVal = fc.showSaveDialog(MainApplication.getMainFrame());
         if (returnVal == JFileChooser.APPROVE_OPTION) {
             file = fc.getSelectedFile();
@@ -96,5 +96,5 @@
                 try {
                     ImageIO.write(bi, "png", file);
-/*
+                    /*
                     FileOutputStream flux = new FileOutputStream(file);
                     BufferedOutputStream fluxBuf = new BufferedOutputStream(flux);
@@ -102,5 +102,5 @@
                     codec.encode(bi);
                     fluxBuf.close();
-*/
+                    */
                 } catch (IOException e) {
                     e.printStackTrace();
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/WMSDownloadAction.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/WMSDownloadAction.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/WMSDownloadAction.java	(revision 34458)
@@ -9,9 +9,9 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.MainApplication;
 //import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.WMSLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 final class WMSDownloadAction {
@@ -37,8 +37,8 @@
             if (existingWMSlayers.size() == 0)
                 return new MenuActionNewLocation().addNewLayer(existingWMSlayers);
-            if (Main.pref.getBoolean("cadastrewms.autoFirstLayer", false)) {
+            if (Config.getPref().getBoolean("cadastrewms.autoFirstLayer", false)) {
                 return existingWMSlayers.get(0);
             } else {
-                JOptionPane.showMessageDialog(Main.parent,
+                JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                         tr("More than one WMS layer present\nSelect one of them first, then retry"));
             }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/mapmode/Address.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/mapmode/Address.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/mapmode/Address.java	(revision 34458)
@@ -41,5 +41,4 @@
 import javax.swing.event.ChangeListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.command.AddCommand;
@@ -48,7 +47,9 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -58,4 +59,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -145,5 +147,5 @@
                 addStreetNameOrRelation(currentMouseNode, cmds);
                 Command c = new SequenceCommand("Add node address", cmds);
-                Main.main.undoRedo.add(c);
+                UndoRedoHandler.getInstance().add(c);
                 setNewSelection(currentMouseNode);
             } else {
@@ -159,5 +161,5 @@
                 }
                 if (currentMouseNode.get(tagHouseStreet) != null) {
-                    if (Main.pref.getBoolean("cadastrewms.addr.dontUseRelation", false)) {
+                    if (Config.getPref().getBoolean("cadastrewms.addr.dontUseRelation", false)) {
                         inputStreet.setText(currentMouseNode.get(tagHouseStreet));
                         if (ctrl) {
@@ -253,10 +255,10 @@
         Map<String, String> tags = new HashMap<>();
         tags.put(tagHouseNumber, inputNumber.getText());
-        cmds.add(new ChangePropertyCommand(Main.main.getEditDataSet(), Collections.singleton(osm), tags));
+        cmds.add(new ChangePropertyCommand(OsmDataManager.getInstance().getEditDataSet(), Collections.singleton(osm), tags));
         addStreetNameOrRelation(osm, cmds);
         try {
             applyInputNumberChange();
             Command c = new SequenceCommand("Add node address", cmds);
-            Main.main.undoRedo.add(c);
+            UndoRedoHandler.getInstance().add(c);
             setNewSelection(osm);
         } catch (NumberFormatException ex) {
@@ -276,5 +278,5 @@
 
     private void addStreetNameOrRelation(OsmPrimitive osm, Collection<Command> cmds) {
-        if (Main.pref.getBoolean("cadastrewms.addr.dontUseRelation", false)) {
+        if (Config.getPref().getBoolean("cadastrewms.addr.dontUseRelation", false)) {
             cmds.add(new ChangePropertyCommand(osm, tagHouseStreet, inputStreet.getText()));
         } else if (selectedWay != null) {
@@ -293,5 +295,5 @@
                 newRel.addMember(new RelationMember(relationAddrStreetRole, selectedWay));
                 newRel.addMember(new RelationMember(relationMemberHouse, osm));
-                cmds.add(new AddCommand(Main.main.getEditDataSet(), newRel));
+                cmds.add(new AddCommand(OsmDataManager.getInstance().getEditDataSet(), newRel));
             }
         }
@@ -301,5 +303,5 @@
         // DrawAction.mouseReleased() but without key modifiers
         Node n = new Node(MainApplication.getMap().mapView.getLatLon(e.getX(), e.getY()));
-        cmds.add(new AddCommand(Main.main.getEditDataSet(), n));
+        cmds.add(new AddCommand(OsmDataManager.getInstance().getEditDataSet(), n));
         List<WaySegment> wss = MainApplication.getMap().mapView.getNearestWaySegments(e.getPoint(), OsmPrimitive::isSelectable);
         Map<Way, List<Integer>> insertPoints = new HashMap<>();
@@ -371,5 +373,5 @@
 
             int snapToIntersectionThreshold
-            = Main.pref.getInt("edit.snap-intersection-threshold", 10);
+            = Config.getPref().getInt("edit.snap-intersection-threshold", 10);
 
             // only adjust to intersection if within snapToIntersectionThreshold pixel of mouse click; otherwise
@@ -478,9 +480,9 @@
         p.add(minusOne, GBC.std().insets(10, 0, 10, 0));
         p.add(plusOne, GBC.std().insets(0, 0, 10, 0));
-        tagPolygon.setSelected(Main.pref.getBoolean("cadastrewms.addr.onBuilding", false));
+        tagPolygon.setSelected(Config.getPref().getBoolean("cadastrewms.addr.onBuilding", false));
         tagPolygon.addChangeListener(new ChangeListener() {
             @Override
             public void stateChanged(ChangeEvent arg0) {
-                Main.pref.putBoolean("cadastrewms.addr.onBuilding", tagPolygon.isSelected());
+                Config.getPref().putBoolean("cadastrewms.addr.onBuilding", tagPolygon.isSelected());
             }
         });
@@ -494,10 +496,10 @@
                 JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION,
                 null, options, null);
-        dialog = pane.createDialog(Main.parent, tr("Enter addresses"));
+        dialog = pane.createDialog(MainApplication.getMainFrame(), tr("Enter addresses"));
         dialog.setModal(false);
         dialog.setAlwaysOnTop(true);
         dialog.addComponentListener(new ComponentAdapter() {
             protected void rememberGeometry() {
-                Main.pref.put("cadastrewms.addr.bounds", dialog.getX()+","+dialog.getY()+","+dialog.getWidth()+","+dialog.getHeight());
+                Config.getPref().put("cadastrewms.addr.bounds", dialog.getX()+","+dialog.getY()+","+dialog.getWidth()+","+dialog.getHeight());
             }
 
@@ -516,5 +518,5 @@
             }
         });
-        String bounds = Main.pref.get("cadastrewms.addr.bounds", null);
+        String bounds = Config.getPref().get("cadastrewms.addr.bounds", null);
         if (bounds != null) {
             String[] b = bounds.split(",");
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/upload/CheckSourceUploadHook.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/upload/CheckSourceUploadHook.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/actions/upload/CheckSourceUploadHook.java	(revision 34458)
@@ -15,11 +15,12 @@
 import javax.swing.JTextField;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.upload.UploadHook;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.plugins.fr.cadastre.CadastrePlugin;
@@ -78,8 +79,8 @@
             l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
             p.add(new JScrollPane(l), GBC.eol().fill());
-            boolean bContinue = JOptionPane.showConfirmDialog(Main.parent, p, tr("Add \"source=...\" to elements?"),
+            boolean bContinue = JOptionPane.showConfirmDialog(MainApplication.getMainFrame(), p, tr("Add \"source=...\" to elements?"),
                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
             if (bContinue)
-                Main.main.undoRedo.add(new ChangePropertyCommand(sel, "source", tf.getText()));
+                UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, "source", tf.getText()));
         }
     }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 34458)
@@ -45,8 +45,8 @@
     private static final BiPredicate<CadastreDownloadData, OsmPrimitive> symbo = (x, p) -> !x.isDownloadSymbol();
     private static final BiPredicate<CadastreDownloadData, OsmPrimitive> parce = (x, p) -> !x.isDownloadParcel();
-    private static final BiPredicate<CadastreDownloadData, OsmPrimitive> parcn = (x, p) -> !x.isDownloadParcelNumber();
+    //private static final BiPredicate<CadastreDownloadData, OsmPrimitive> parcn = (x, p) -> !x.isDownloadParcelNumber();
     private static final BiPredicate<CadastreDownloadData, OsmPrimitive> addre = (x, p) -> !x.isDownloadAddress();
     private static final BiPredicate<CadastreDownloadData, OsmPrimitive> local = (x, p) -> !x.isDownloadLocality();
-    private static final BiPredicate<CadastreDownloadData, OsmPrimitive> secti = (x, p) -> !x.isDownloadSection();
+    //private static final BiPredicate<CadastreDownloadData, OsmPrimitive> secti = (x, p) -> !x.isDownloadSection();
     private static final BiPredicate<CadastreDownloadData, OsmPrimitive> commu = (x, p) -> !x.isDownloadCommune();
 
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/preferences/CadastrePreferenceSetting.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/preferences/CadastrePreferenceSetting.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/preferences/CadastrePreferenceSetting.java	(revision 34458)
@@ -23,9 +23,9 @@
 import javax.swing.SwingConstants;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.plugins.fr.cadastre.CadastrePlugin;
 import org.openstreetmap.josm.plugins.fr.cadastre.wms.CacheControl;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.I18n;
@@ -140,10 +140,10 @@
 
         // option to alter the original colors of the wms images
-        alterColors.setSelected(Main.pref.getBoolean("cadastrewms.alterColors", false));
+        alterColors.setSelected(Config.getPref().getBoolean("cadastrewms.alterColors", false));
         alterColors.setToolTipText(tr("Replace the original white background by the background color defined in JOSM preferences."));
         cadastrewms.add(alterColors, GBC.eop().insets(0, 0, 0, 0));
 
         // option to reverse the grey colors (to see texts background)
-        reversGrey.setSelected(Main.pref.getBoolean("cadastrewms.invertGrey", false));
+        reversGrey.setSelected(Config.getPref().getBoolean("cadastrewms.invertGrey", false));
         reversGrey.setToolTipText(
                 tr("Invert the original black and white colors (and all intermediate greys). Useful for texts on dark backgrounds."));
@@ -157,5 +157,5 @@
             }
         });
-        transparency.setSelected(Main.pref.getBoolean("cadastrewms.backgroundTransparent", false));
+        transparency.setSelected(Config.getPref().getBoolean("cadastrewms.backgroundTransparent", false));
         transparency.setToolTipText(tr("Allows multiple layers stacking"));
         cadastrewms.add(transparency, GBC.eop().insets(0, 0, 0, 0));
@@ -166,5 +166,5 @@
         sliderTrans.setMajorTickSpacing(10);
         sliderTrans.setMinorTickSpacing(1);
-        sliderTrans.setValue((int) (Float.parseFloat(Main.pref.get("cadastrewms.brightness", "1.0f"))*10));
+        sliderTrans.setValue((int) (Float.parseFloat(Config.getPref().get("cadastrewms.brightness", "1.0f"))*10));
         sliderTrans.setPaintTicks(true);
         sliderTrans.setPaintLabels(false);
@@ -173,5 +173,5 @@
 
         // option to draw boundaries of downloaded data
-        drawBoundaries.setSelected(Main.pref.getBoolean("cadastrewms.drawBoundaries", false));
+        drawBoundaries.setSelected(Config.getPref().getBoolean("cadastrewms.drawBoundaries", false));
         drawBoundaries.setToolTipText(tr("Draw a rectangle around downloaded data from WMS server."));
         cadastrewms.add(drawBoundaries, GBC.eop().insets(0, 0, 0, 5));
@@ -187,5 +187,5 @@
         bgResolution.add(grabRes2);
         bgResolution.add(grabRes3);
-        String currentResolution = Main.pref.get("cadastrewms.resolution", "high");
+        String currentResolution = Config.getPref().get("cadastrewms.resolution", "high");
         if (currentResolution.equals("high"))
             grabRes1.setSelected(true);
@@ -204,5 +204,5 @@
         imageInterpolationMethod.addItem(tr("Bilinear (fast)"));
         imageInterpolationMethod.addItem(tr("Bicubic (slow)"));
-        String savedImageInterpolationMethod = Main.pref.get("cadastrewms.imageInterpolation", "standard");
+        String savedImageInterpolationMethod = Config.getPref().get("cadastrewms.imageInterpolation", "standard");
         if (savedImageInterpolationMethod.equals("bilinear"))
             imageInterpolationMethod.setSelectedIndex(1);
@@ -247,5 +247,5 @@
         bgGrabMultiplier.add(grabMultiplier3);
         bgGrabMultiplier.add(grabMultiplier4);
-        String currentScale = Main.pref.get("cadastrewms.scale", DEFAULT_GRAB_MULTIPLIER);
+        String currentScale = Config.getPref().get("cadastrewms.scale", DEFAULT_GRAB_MULTIPLIER);
         if (currentScale.equals(Scale.X1.value))
             grabMultiplier1.setSelected(true);
@@ -269,29 +269,29 @@
         JLabel jLabelLayers = new JLabel(tr("Layers:"));
         cadastrewms.add(jLabelLayers, GBC.std().insets(0, 5, 10, 0));
-        layerLS3.setSelected(Main.pref.getBoolean("cadastrewms.layerWater", true));
+        layerLS3.setSelected(Config.getPref().getBoolean("cadastrewms.layerWater", true));
         layerLS3.setToolTipText(tr("Sea, rivers, swimming pools."));
         cadastrewms.add(layerLS3, GBC.std().insets(5, 0, 5, 0));
-        layerLS2.setSelected(Main.pref.getBoolean("cadastrewms.layerBuilding", true));
+        layerLS2.setSelected(Config.getPref().getBoolean("cadastrewms.layerBuilding", true));
         layerLS2.setToolTipText(tr("Buildings, covers, underground constructions."));
         cadastrewms.add(layerLS2, GBC.std().insets(5, 0, 5, 0));
-        layerLS1.setSelected(Main.pref.getBoolean("cadastrewms.layerSymbol", true));
+        layerLS1.setSelected(Config.getPref().getBoolean("cadastrewms.layerSymbol", true));
         layerLS1.setToolTipText(tr("Symbols like cristian cross."));
         cadastrewms.add(layerLS1, GBC.std().insets(5, 0, 5, 0));
-        layerParcel.setSelected(Main.pref.getBoolean("cadastrewms.layerParcel", true));
+        layerParcel.setSelected(Config.getPref().getBoolean("cadastrewms.layerParcel", true));
         layerParcel.setToolTipText(tr("Parcels."));
         cadastrewms.add(layerParcel, GBC.eop().insets(5, 0, 5, 0));
-        layerLabel.setSelected(Main.pref.getBoolean("cadastrewms.layerLabel", true));
+        layerLabel.setSelected(Config.getPref().getBoolean("cadastrewms.layerLabel", true));
         layerLabel.setToolTipText(tr("Parcels numbers, street names."));
         cadastrewms.add(layerLabel, GBC.std().insets(70, 0, 5, 0));
-        layerNumero.setSelected(Main.pref.getBoolean("cadastrewms.layerNumero", true));
+        layerNumero.setSelected(Config.getPref().getBoolean("cadastrewms.layerNumero", true));
         layerNumero.setToolTipText(tr("Address, houses numbers."));
         cadastrewms.add(layerNumero, GBC.std().insets(5, 0, 5, 0));
-        layerLieudit.setSelected(Main.pref.getBoolean("cadastrewms.layerLieudit", true));
+        layerLieudit.setSelected(Config.getPref().getBoolean("cadastrewms.layerLieudit", true));
         layerLieudit.setToolTipText(tr("Locality, hamlet, place."));
         cadastrewms.add(layerLieudit, GBC.std().insets(5, 0, 5, 0));
-        layerSection.setSelected(Main.pref.getBoolean("cadastrewms.layerSection", true));
+        layerSection.setSelected(Config.getPref().getBoolean("cadastrewms.layerSection", true));
         layerSection.setToolTipText(tr("Cadastral sections and subsections."));
         cadastrewms.add(layerSection, GBC.std().insets(5, 0, 5, 0));
-        layerCommune.setSelected(Main.pref.getBoolean("cadastrewms.layerCommune", true));
+        layerCommune.setSelected(Config.getPref().getBoolean("cadastrewms.layerCommune", true));
         layerCommune.setToolTipText(tr("Municipality administrative borders."));
         cadastrewms.add(layerCommune, GBC.eop().insets(5, 0, 5, 0));
@@ -301,5 +301,5 @@
 
         // for raster images (not vectorized), image grab divider (from 1 to 12)
-        String savedRasterDivider = Main.pref.get("cadastrewms.rasterDivider", DEFAULT_RASTER_DIVIDER);
+        String savedRasterDivider = Config.getPref().get("cadastrewms.rasterDivider", DEFAULT_RASTER_DIVIDER);
         JLabel jLabelRasterDivider = new JLabel(tr("Raster images grab multiplier:"));
         rasterDivider.setText(savedRasterDivider);
@@ -308,13 +308,13 @@
         cadastrewms.add(rasterDivider, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 200, 5));
         // option to disable image cropping during raster image georeferencing
-        disableImageCropping.setSelected(Main.pref.getBoolean("cadastrewms.noImageCropping", false));
+        disableImageCropping.setSelected(Config.getPref().getBoolean("cadastrewms.noImageCropping", false));
         disableImageCropping.setToolTipText(tr("Disable image cropping during georeferencing."));
         cadastrewms.add(disableImageCropping, GBC.std().insets(0, 0, 10, 0));
         // option to add the "Tableau d'assemblage" in list of sheets to grab
-        enableTableauAssemblage.setSelected(Main.pref.getBoolean("cadastrewms.useTA", false));
+        enableTableauAssemblage.setSelected(Config.getPref().getBoolean("cadastrewms.useTA", false));
         enableTableauAssemblage.setToolTipText(tr("Add the \"Tableau(x) d''assemblage\" in the list of cadastre sheets to grab."));
         cadastrewms.add(enableTableauAssemblage, GBC.eop().insets(0, 0, 0, 0));
         // option to use 2 bits colors only
-        simplify2BitsColors.setSelected(Main.pref.getBoolean("cadastrewms.raster2bitsColors", false));
+        simplify2BitsColors.setSelected(Config.getPref().getBoolean("cadastrewms.raster2bitsColors", false));
         simplify2BitsColors.setToolTipText(tr("Replace greyscale by white color (smaller files and memory usage)."));
         cadastrewms.add(simplify2BitsColors, GBC.eop().insets(0, 0, 0, 0));
@@ -348,5 +348,5 @@
             }
         });
-        enableCache.setSelected(Main.pref.getBoolean("cadastrewms.enableCaching", true));
+        enableCache.setSelected(Config.getPref().getBoolean("cadastrewms.enableCaching", true));
         enableCache.setToolTipText(tr("Allows an automatic caching"));
         cadastrewms.add(enableCache, GBC.eop().insets(0, 0, 0, 0));
@@ -363,5 +363,5 @@
 
         // option to select the first WMS layer
-        autoFirstLayer.setSelected(Main.pref.getBoolean("cadastrewms.autoFirstLayer", false));
+        autoFirstLayer.setSelected(Config.getPref().getBoolean("cadastrewms.autoFirstLayer", false));
         autoFirstLayer.setToolTipText(tr("Automatically selects the first WMS layer if multiple layers exist when grabbing."));
         cadastrewms.add(autoFirstLayer, GBC.eop().insets(0, 0, 0, 0));
@@ -371,5 +371,5 @@
 
         // option to use or not relations in addresses
-        dontUseRelation.setSelected(Main.pref.getBoolean("cadastrewms.addr.dontUseRelation", false));
+        dontUseRelation.setSelected(Config.getPref().getBoolean("cadastrewms.addr.dontUseRelation", false));
         dontUseRelation.setToolTipText(tr("Enable this to use the tag \"add:street\" on nodes."));
         cadastrewms.add(dontUseRelation, GBC.eop().insets(0, 0, 0, 0));
@@ -384,74 +384,74 @@
     @Override
     public boolean ok() {
-        Main.pref.put("cadastrewms.source", sourcing.getText());
+        Config.getPref().put("cadastrewms.source", sourcing.getText());
         CadastrePlugin.source = sourcing.getText();
-        Main.pref.putBoolean("cadastrewms.alterColors", alterColors.isSelected());
-        Main.pref.putBoolean("cadastrewms.invertGrey", reversGrey.isSelected());
-        Main.pref.putBoolean("cadastrewms.backgroundTransparent", transparency.isSelected());
-        Main.pref.put("cadastrewms.brightness", Float.toString((float) sliderTrans.getValue()/10));
-        Main.pref.putBoolean("cadastrewms.drawBoundaries", drawBoundaries.isSelected());
+        Config.getPref().putBoolean("cadastrewms.alterColors", alterColors.isSelected());
+        Config.getPref().putBoolean("cadastrewms.invertGrey", reversGrey.isSelected());
+        Config.getPref().putBoolean("cadastrewms.backgroundTransparent", transparency.isSelected());
+        Config.getPref().put("cadastrewms.brightness", Float.toString((float) sliderTrans.getValue()/10));
+        Config.getPref().putBoolean("cadastrewms.drawBoundaries", drawBoundaries.isSelected());
         if (grabRes1.isSelected())
-            Main.pref.put("cadastrewms.resolution", "high");
+            Config.getPref().put("cadastrewms.resolution", "high");
         else if (grabRes2.isSelected())
-            Main.pref.put("cadastrewms.resolution", "medium");
+            Config.getPref().put("cadastrewms.resolution", "medium");
         else if (grabRes3.isSelected())
-            Main.pref.put("cadastrewms.resolution", "low");
+            Config.getPref().put("cadastrewms.resolution", "low");
         if (imageInterpolationMethod.getSelectedIndex() == 2)
-            Main.pref.put("cadastrewms.imageInterpolation", "bicubic");
+            Config.getPref().put("cadastrewms.imageInterpolation", "bicubic");
         else if (imageInterpolationMethod.getSelectedIndex() == 1)
-            Main.pref.put("cadastrewms.imageInterpolation", "bilinear");
+            Config.getPref().put("cadastrewms.imageInterpolation", "bilinear");
         else
-            Main.pref.put("cadastrewms.imageInterpolation", "standard");
+            Config.getPref().put("cadastrewms.imageInterpolation", "standard");
         if (grabMultiplier1.isSelected())
-            Main.pref.put("cadastrewms.scale", Scale.X1.toString());
+            Config.getPref().put("cadastrewms.scale", Scale.X1.toString());
         else if (grabMultiplier2.isSelected())
-            Main.pref.put("cadastrewms.scale", Scale.X2.toString());
+            Config.getPref().put("cadastrewms.scale", Scale.X2.toString());
         else if (grabMultiplier3.isSelected())
-            Main.pref.put("cadastrewms.scale", Scale.X3.toString());
+            Config.getPref().put("cadastrewms.scale", Scale.X3.toString());
         else {
-            Main.pref.put("cadastrewms.scale", Scale.SQUARE_100M.toString());
+            Config.getPref().put("cadastrewms.scale", Scale.SQUARE_100M.toString());
             try {
                 int squareSize = Integer.parseInt(grabMultiplier4Size.getText());
                 if (squareSize >= 25 && squareSize <= 1000)
-                    Main.pref.put("cadastrewms.squareSize", grabMultiplier4Size.getText());
+                    Config.getPref().put("cadastrewms.squareSize", grabMultiplier4Size.getText());
             } catch (NumberFormatException e) {
                 Logging.debug(e);
             }
         }
-        Main.pref.putBoolean("cadastrewms.layerWater", layerLS3.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerBuilding", layerLS2.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerSymbol", layerLS1.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerParcel", layerParcel.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerLabel", layerLabel.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerNumero", layerNumero.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerLieudit", layerLieudit.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerSection", layerSection.isSelected());
-        Main.pref.putBoolean("cadastrewms.layerCommune", layerCommune.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerWater", layerLS3.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerBuilding", layerLS2.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerSymbol", layerLS1.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerParcel", layerParcel.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerLabel", layerLabel.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerNumero", layerNumero.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerLieudit", layerLieudit.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerSection", layerSection.isSelected());
+        Config.getPref().putBoolean("cadastrewms.layerCommune", layerCommune.isSelected());
         try {
             int i = Integer.parseInt(rasterDivider.getText());
             if (i > 0 && i < 13)
-                Main.pref.put("cadastrewms.rasterDivider", String.valueOf(i));
+                Config.getPref().put("cadastrewms.rasterDivider", String.valueOf(i));
         } catch (NumberFormatException e) {
             Logging.debug(e);
         }
-        Main.pref.putBoolean("cadastrewms.noImageCropping", disableImageCropping.isSelected());
-        Main.pref.putBoolean("cadastrewms.useTA", enableTableauAssemblage.isSelected());
-        Main.pref.putBoolean("cadastrewms.raster2bitsColors", simplify2BitsColors.isSelected());
-        if (crosspiece1.isSelected()) Main.pref.put("cadastrewms.crosspieces", "0");
-        else if (crosspiece2.isSelected()) Main.pref.put("cadastrewms.crosspieces", "1");
-        else if (crosspiece3.isSelected()) Main.pref.put("cadastrewms.crosspieces", "2");
-        else if (crosspiece4.isSelected()) Main.pref.put("cadastrewms.crosspieces", "3");
-        Main.pref.putBoolean("cadastrewms.enableCaching", enableCache.isSelected());
+        Config.getPref().putBoolean("cadastrewms.noImageCropping", disableImageCropping.isSelected());
+        Config.getPref().putBoolean("cadastrewms.useTA", enableTableauAssemblage.isSelected());
+        Config.getPref().putBoolean("cadastrewms.raster2bitsColors", simplify2BitsColors.isSelected());
+        if (crosspiece1.isSelected()) Config.getPref().put("cadastrewms.crosspieces", "0");
+        else if (crosspiece2.isSelected()) Config.getPref().put("cadastrewms.crosspieces", "1");
+        else if (crosspiece3.isSelected()) Config.getPref().put("cadastrewms.crosspieces", "2");
+        else if (crosspiece4.isSelected()) Config.getPref().put("cadastrewms.crosspieces", "3");
+        Config.getPref().putBoolean("cadastrewms.enableCaching", enableCache.isSelected());
 
         // spread data into objects instead of restarting the application
         try {
             CacheControl.cacheSize = Integer.parseInt(cacheSize.getText());
-            Main.pref.put("cadastrewms.cacheSize", String.valueOf(CacheControl.cacheSize));
+            Config.getPref().put("cadastrewms.cacheSize", String.valueOf(CacheControl.cacheSize));
         } catch (NumberFormatException e) {
             Logging.debug(e);
         }
-        Main.pref.putBoolean("cadastrewms.autoFirstLayer", autoFirstLayer.isSelected());
+        Config.getPref().putBoolean("cadastrewms.autoFirstLayer", autoFirstLayer.isSelected());
         CacheControl.cacheEnabled = enableCache.isSelected();
-        Main.pref.putBoolean("cadastrewms.addr.dontUseRelation", dontUseRelation.isSelected());
+        Config.getPref().putBoolean("cadastrewms.addr.dontUseRelation", dontUseRelation.isSelected());
         CadastrePlugin.refreshConfiguration();
         CadastrePlugin.refreshMenu();
@@ -462,5 +462,5 @@
     private int getNumber(String pref_parameter, int def_value) {
         try {
-            return Integer.parseInt(Main.pref.get(pref_parameter, String.valueOf(def_value)));
+            return Integer.parseInt(Config.getPref().get(pref_parameter, String.valueOf(def_value)));
         } catch (NumberFormatException e) {
             return def_value;
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/CacheControl.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/CacheControl.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/CacheControl.java	(revision 34458)
@@ -20,8 +20,9 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.plugins.fr.cadastre.CadastrePlugin;
 import org.openstreetmap.josm.plugins.fr.cadastre.preferences.CadastrePreferenceSetting;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -69,8 +70,9 @@
 
     public CacheControl(WMSLayer wmsLayer) {
-        cacheEnabled = Main.pref.getBoolean("cadastrewms.enableCaching", true);
+        cacheEnabled = Config.getPref().getBoolean("cadastrewms.enableCaching", true);
         this.wmsLayer = wmsLayer;
         try {
-            cacheSize = Integer.parseInt(Main.pref.get("cadastrewms.cacheSize", String.valueOf(CadastrePreferenceSetting.DEFAULT_CACHE_SIZE)));
+            cacheSize = Integer.parseInt(Config.getPref().get("cadastrewms.cacheSize",
+                    String.valueOf(CadastrePreferenceSetting.DEFAULT_CACHE_SIZE)));
         } catch (NumberFormatException e) {
             cacheSize = CadastrePreferenceSetting.DEFAULT_CACHE_SIZE;
@@ -121,5 +123,5 @@
                             JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION, null);
                     // this below is a temporary workaround to fix the "always on top" issue
-                    JDialog dialog = pane.createDialog(Main.parent, tr("Select Feuille"));
+                    JDialog dialog = pane.createDialog(MainApplication.getMainFrame(), tr("Select Feuille"));
                     CadastrePlugin.prepareDialog(dialog);
                     dialog.setVisible(true);
@@ -160,5 +162,5 @@
         } catch (IOException | ClassNotFoundException ex) {
             Logging.error(ex);
-            GuiHelper.runInEDTAndWait(() -> JOptionPane.showMessageDialog(Main.parent,
+            GuiHelper.runInEDTAndWait(() -> JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                     tr("Error loading file.\nProbably an old version of the cache file."),
                     tr("Error"), JOptionPane.ERROR_MESSAGE));
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/CadastreInterface.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/CadastreInterface.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/CadastreInterface.java	(revision 34458)
@@ -24,5 +24,4 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.validation.util.Entities;
@@ -32,4 +31,5 @@
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.plugins.fr.cadastre.CadastrePlugin;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.HttpClient;
@@ -109,5 +109,5 @@
             Logging.error(e);
             GuiHelper.runInEDT(() ->
-                JOptionPane.showMessageDialog(Main.parent,
+                JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                     tr("Town/city {0} not found or not available\n" +
                             "or action canceled", wmsLayer.getLocation())));
@@ -221,6 +221,6 @@
                         wmsLayer.setCodeCommune(newCodeCommune);
                         wmsLayer.setLocation(newLocation);
-                        Main.pref.put("cadastrewms.codeCommune", newCodeCommune);
-                        Main.pref.put("cadastrewms.location", newLocation);
+                        Config.getPref().put("cadastrewms.codeCommune", newCodeCommune);
+                        Config.getPref().put("cadastrewms.location", newLocation);
                     }
                     checkLayerDuplicates(wmsLayer);
@@ -393,5 +393,5 @@
         // get "Tableau d'assemblage"
         String inputTA = input;
-        if (Main.pref.getBoolean("cadastrewms.useTA", false)) {
+        if (Config.getPref().getBoolean("cadastrewms.useTA", false)) {
             while (inputTA.indexOf(C_TA_IMAGE_LINK_START) != -1) {
                 inputTA = inputTA.substring(inputTA.indexOf(C_TA_IMAGE_LINK_START) + C_TA_IMAGE_LINK_START.length()
@@ -427,5 +427,5 @@
             JOptionPane pane = new JOptionPane(p, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null);
             // this below is a temporary workaround to fix the "always on top" issue
-            JDialog dialog = pane.createDialog(Main.parent, tr("Select commune"));
+            JDialog dialog = pane.createDialog(MainApplication.getMainFrame(), tr("Select commune"));
             CadastrePlugin.prepareDialog(dialog);
             dialog.setVisible(true);
@@ -448,5 +448,5 @@
             JOptionPane pane = new JOptionPane(p, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null);
             // this below is a temporary workaround to fix the "always on top" issue
-            JDialog dialog = pane.createDialog(Main.parent, tr("Select Feuille"));
+            JDialog dialog = pane.createDialog(MainApplication.getMainFrame(), tr("Select Feuille"));
             CadastrePlugin.prepareDialog(dialog);
             dialog.setVisible(true);
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadSVGBuilding.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadSVGBuilding.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadSVGBuilding.java	(revision 34458)
@@ -20,12 +20,14 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
@@ -118,5 +120,5 @@
             Way wayToAdd = new Way();
             for (EastNorth eastNorth : path) {
-                Node nodeToAdd = new Node(Main.getProjection().eastNorth2latlon(eastNorth));
+                Node nodeToAdd = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(eastNorth));
                 // check if new node is not already created by another new path
                 Node nearestNewNode = checkNearestNode(nodeToAdd, svgDataSet.getNodes());
@@ -157,5 +159,5 @@
         }
 
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         Collection<Command> cmds = new LinkedList<>();
         for (Node node : svgDataSet.getNodes()) {
@@ -167,5 +169,5 @@
                 cmds.add(new AddCommand(ds, way));
         }
-        Main.main.undoRedo.add(new SequenceCommand(tr("Create buildings"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Create buildings"), cmds));
         MainApplication.getMap().repaint();
     }
@@ -267,10 +269,10 @@
         if ((currentView.max.east() - currentView.min.east()) > 1000 ||
                 (currentView.max.north() - currentView.min.north() > 1000)) {
-            JOptionPane.showMessageDialog(Main.parent,
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                     tr("To avoid cadastre WMS overload,\nbuilding import size is limited to 1 km2 max."));
             return;
         }
         if (CadastrePlugin.autoSourcing == false) {
-            JOptionPane.showMessageDialog(Main.parent,
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                     tr("Please, enable auto-sourcing and check cadastre millesime."));
             return;
@@ -278,5 +280,5 @@
         MainApplication.worker.execute(new DownloadSVGBuilding(wmsLayer));
         if (errorMessage != null)
-            JOptionPane.showMessageDialog(Main.parent, errorMessage);
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), errorMessage);
     }
 
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadSVGTask.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadSVGTask.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadSVGTask.java	(revision 34458)
@@ -22,12 +22,14 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
@@ -123,8 +125,8 @@
         List<Node> nodeList = new ArrayList<>();
         for (EastNorth eastNorth : eastNorths.get(bestPath)) {
-            nodeList.add(new Node(Main.getProjection().eastNorth2latlon(eastNorth)));
+            nodeList.add(new Node(ProjectionRegistry.getProjection().eastNorth2latlon(eastNorth)));
         }
         Way wayToAdd = new Way();
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         Collection<Command> cmds = new LinkedList<>();
         for (Node node : nodeList) {
@@ -135,5 +137,5 @@
 
         cmds.add(new AddCommand(ds, wayToAdd));
-        Main.main.undoRedo.add(new SequenceCommand(tr("Create boundary"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Create boundary"), cmds));
         MainApplication.getMap().repaint();
     }
@@ -215,5 +217,5 @@
     public static void download(WMSLayer wmsLayer) {
         if (!CadastrePlugin.autoSourcing) {
-            JOptionPane.showMessageDialog(Main.parent,
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                     tr("Please, enable auto-sourcing and check cadastre millesime."));
             return;
@@ -221,5 +223,5 @@
         MainApplication.worker.execute(new DownloadSVGTask(wmsLayer));
         if (errorMessage != null)
-            JOptionPane.showMessageDialog(Main.parent, errorMessage);
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), errorMessage);
     }
 }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadWMSPlanImage.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadWMSPlanImage.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadWMSPlanImage.java	(revision 34458)
@@ -10,5 +10,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -40,5 +39,5 @@
                         JOptionPane pane = new JOptionPane(tr("Image already loaded"), JOptionPane.INFORMATION_MESSAGE);
                         // this below is a temporary workaround to fix the "always on top" issue
-                        JDialog dialog = pane.createDialog(Main.parent, "");
+                        JDialog dialog = pane.createDialog(MainApplication.getMainFrame(), "");
                         CadastrePlugin.prepareDialog(dialog);
                         dialog.setVisible(true);
@@ -70,5 +69,5 @@
                             }
                         } else {
-                            /*JOptionPane.showMessageDialog(Main.parent,tr("Municipality vectorized !\n"+
+                            /*JOptionPane.showMessageDialog(MainApplication.getMainFrame(),tr("Municipality vectorized !\n"+
                                     "Use the normal Cadastre Grab menu."));*/
                             JOptionPane pane = new JOptionPane(
@@ -76,5 +75,5 @@
                                     JOptionPane.INFORMATION_MESSAGE);
                             // this below is a temporary workaround to fix the "always on top" issue
-                            JDialog dialog = pane.createDialog(Main.parent, "");
+                            JDialog dialog = pane.createDialog(MainApplication.getMainFrame(), "");
                             CadastrePlugin.prepareDialog(dialog);
                             dialog.setVisible(true);
@@ -114,5 +113,5 @@
         task = MainApplication.worker.submit(t, t);
         if (errorMessage != null)
-            JOptionPane.showMessageDialog(Main.parent, errorMessage);
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), errorMessage);
     }
 
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadWMSVectorImage.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadWMSVectorImage.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/DownloadWMSVectorImage.java	(revision 34458)
@@ -8,5 +8,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -46,5 +45,5 @@
                         // set raster image commune bounding box based on current view (before adjustment)
                         GuiHelper.runInEDT(() ->
-                            JOptionPane.showMessageDialog(Main.parent,
+                            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                                 tr("This commune is not vectorized.\nPlease use the other menu entry to georeference a \"Plan image\"")));
                         MainApplication.getLayerManager().removeLayer(wmsLayer);
@@ -89,5 +88,5 @@
         MainApplication.worker.execute(new DownloadWMSVectorImage(wmsLayer, bounds));
         if (errorMessage != null)
-            JOptionPane.showMessageDialog(Main.parent, errorMessage);
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), errorMessage);
     }
 }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/EastNorthBound.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/EastNorthBound.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/EastNorthBound.java	(revision 34458)
@@ -4,7 +4,7 @@
 import java.io.Serializable;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 
 public class EastNorthBound implements Serializable {
@@ -33,5 +33,5 @@
 
     public Bounds toBounds() {
-        return new Bounds(Main.getProjection().eastNorth2latlon(min), Main.getProjection().eastNorth2latlon(max));
+        return new Bounds(ProjectionRegistry.getProjection().eastNorth2latlon(min), ProjectionRegistry.getProjection().eastNorth2latlon(max));
     }
 
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/RasterImageGeoreferencer.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/RasterImageGeoreferencer.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/RasterImageGeoreferencer.java	(revision 34458)
@@ -16,8 +16,9 @@
 import javax.swing.JTextField;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -56,5 +57,5 @@
        mode = cGetCorners;
        countMouseClicked = 0;
-       initialClickDelay = Main.pref.getInt("cadastrewms.georef-click-delay", 200);
+       initialClickDelay = Config.getPref().getInt("cadastrewms.georef-click-delay", 200);
        mouseClickedTime = System.currentTimeMillis();
        Object[] options = {"OK", "Cancel"};
@@ -80,5 +81,5 @@
       countMouseClicked = 0;
       mode = cGetLambertCrosspieces;
-      initialClickDelay = Main.pref.getInt("cadastrewms.georef-click-delay", 200);
+      initialClickDelay = Config.getPref().getInt("cadastrewms.georef-click-delay", 200);
       mouseClickedTime = System.currentTimeMillis();
       Object[] options = {"OK", "Cancel"};
@@ -110,5 +111,5 @@
           return;
       if (ignoreMouseClick) return; // In case we are currently just allowing zooming to read lambert coordinates
-      EastNorth ea = Main.getProjection().latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(e.getX(), e.getY()));
+      EastNorth ea = ProjectionRegistry.getProjection().latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(e.getX(), e.getY()));
       Logging.info("click:"+countMouseClicked+" ,"+ea+", mode:"+mode);
       if (clickOnTheMap) {
@@ -179,5 +180,5 @@
      // handle an NPE case I'm not able to reproduce
      if (org1 == null || org2 == null || dst1 == null || dst2 == null) {
-         JOptionPane.showMessageDialog(Main.parent,
+         JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                  tr("Ooops. I failed to catch all coordinates\n"+
                     "correctly. Retry please."));
@@ -238,5 +239,5 @@
      else
          number = "second";
-     JDialog dialog = pane.createDialog(Main.parent, tr(
+     JDialog dialog = pane.createDialog(MainApplication.getMainFrame(), tr(
              "Set {0} Lambert coordinates", number));
      dialog.setModal(false);
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/RasterImageModifier.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/RasterImageModifier.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/RasterImageModifier.java	(revision 34458)
@@ -7,5 +7,5 @@
 import java.awt.image.IndexColorModel;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 public class RasterImageModifier extends ImageModifier {
@@ -19,8 +19,8 @@
     public RasterImageModifier(BufferedImage bi) {
         setBufferedImage(bi);
-        transparencyEnabled = Main.pref.getBoolean("cadastrewms.backgroundTransparent");
+        transparencyEnabled = Config.getPref().getBoolean("cadastrewms.backgroundTransparent");
         if (transparencyEnabled)
             makeTransparent();
-        if (Main.pref.getBoolean("cadastrewms.invertGrey"))
+        if (Config.getPref().getBoolean("cadastrewms.invertGrey"))
             invertGrey();
     }
@@ -65,5 +65,5 @@
             BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
             // converting grey scale colors to black/white is configurable (use less resources but is less readable)
-            boolean simplifyColors = Main.pref.getBoolean("cadastrewms.raster2bitsColors", false);
+            boolean simplifyColors = Config.getPref().getBoolean("cadastrewms.raster2bitsColors", false);
             for (int y = 0; y < height; y++) {
                 for (int x = 0; x < width; x++) {
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/VectorImageModifier.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/VectorImageModifier.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/VectorImageModifier.java	(revision 34458)
@@ -8,5 +8,5 @@
 import java.awt.image.WritableRaster;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ColorHelper;
 
@@ -25,9 +25,9 @@
     public VectorImageModifier(BufferedImage bi, boolean monocolor) {
         setBufferedImage(bi);
-        if (Main.pref.getBoolean("cadastrewms.backgroundTransparent"))
+        if (Config.getPref().getBoolean("cadastrewms.backgroundTransparent"))
             makeTransparent();
-        else if (Main.pref.getBoolean("cadastrewms.alterColors"))
+        else if (Config.getPref().getBoolean("cadastrewms.alterColors"))
             replaceBackground();
-        if (Main.pref.getBoolean("cadastrewms.invertGrey"))
+        if (Config.getPref().getBoolean("cadastrewms.invertGrey"))
             invertGrey();
         if (monocolor)
@@ -41,5 +41,5 @@
         int w = bufferedImage.getWidth();
         int h = bufferedImage.getHeight();
-        int josmBackgroundColor = ColorHelper.html2color(Main.pref.get("color.background", "#000000")).getRGB();
+        int josmBackgroundColor = ColorHelper.html2color(Config.getPref().get("color.background", "#000000")).getRGB();
         for (int x = 0; x < w; x++) {
             for (int y = 0; y < h; y++) {
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/WMSException.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/WMSException.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/WMSException.java	(revision 34458)
@@ -2,16 +2,20 @@
 package org.openstreetmap.josm.plugins.fr.cadastre.wms;
 
+/**
+ * Exception thrown in case of WMS error.
+ */
 public class WMSException extends Exception {
-    private String message;
     private static final long serialVersionUID = 1L;
 
+    /**
+     * Constructs a new {@code WMSException} with the specified detail message.
+     * The cause is not initialized, and may subsequently be initialized by
+     * a call to {@link #initCause}.
+     *
+     * @param  message the detail message. The detail message is saved for
+     *         later retrieval by the {@link #getMessage()} method.
+     */
     public WMSException(String message) {
-        super();
-        this.message = message;
-    }
-
-    @Override
-    public String getMessage() {
-        return message;
+        super(message);
     }
 }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/WMSLayer.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/WMSLayer.java	(revision 34457)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/wms/WMSLayer.java	(revision 34458)
@@ -31,9 +31,9 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
@@ -49,4 +49,5 @@
 import org.openstreetmap.josm.plugins.fr.cadastre.actions.mapmode.WMSAdjustAction;
 import org.openstreetmap.josm.plugins.fr.cadastre.preferences.CadastrePreferenceSetting;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -175,9 +176,10 @@
         } else {
             if (isRaster) {
-                divideBbox(new Bounds(Main.getProjection().eastNorth2latlon(rasterMin), Main.getProjection().eastNorth2latlon(rasterMax)),
-                        Integer.parseInt(Main.pref.get("cadastrewms.rasterDivider", CadastrePreferenceSetting.DEFAULT_RASTER_DIVIDER)));
+                divideBbox(new Bounds(ProjectionRegistry.getProjection().eastNorth2latlon(rasterMin),
+                        ProjectionRegistry.getProjection().eastNorth2latlon(rasterMax)),
+                        Integer.parseInt(Config.getPref().get("cadastrewms.rasterDivider", CadastrePreferenceSetting.DEFAULT_RASTER_DIVIDER)));
             } else
                 divideBbox(b,
-                        Integer.parseInt(Main.pref.get("cadastrewms.scale", CadastrePreferenceSetting.DEFAULT_GRAB_MULTIPLIER)));
+                        Integer.parseInt(Config.getPref().get("cadastrewms.scale", CadastrePreferenceSetting.DEFAULT_GRAB_MULTIPLIER)));
         }
         grabThread.addImages(dividedBbox);
@@ -195,6 +197,6 @@
      */
     private void divideBbox(Bounds b, int factor) {
-        EastNorth lambertMin = Main.getProjection().latlon2eastNorth(b.getMin());
-        EastNorth lambertMax = Main.getProjection().latlon2eastNorth(b.getMax());
+        EastNorth lambertMin = ProjectionRegistry.getProjection().latlon2eastNorth(b.getMin());
+        EastNorth lambertMax = ProjectionRegistry.getProjection().latlon2eastNorth(b.getMax());
         double minEast = lambertMin.east()+deltaEast;
         double minNorth = lambertMin.north()+deltaNorth;
@@ -212,5 +214,6 @@
             // divide to fixed size squares
             // grab all square in a spiral starting from the center (usually the most interesting place)
-            int c = Integer.parseInt(Main.pref.get("cadastrewms.squareSize", String.valueOf(CadastrePreferenceSetting.DEFAULT_SQUARE_SIZE)));
+            int c = Integer.parseInt(Config.getPref().get("cadastrewms.squareSize",
+                    String.valueOf(CadastrePreferenceSetting.DEFAULT_SQUARE_SIZE)));
             lambertMin = lambertMin.add(-minEast % c, -minNorth % c);
             lambertMax = lambertMax.add(c - lambertMax.east() % c, c - lambertMax.north() % c);
@@ -289,5 +292,5 @@
             Object savedInterpolation = g.getRenderingHint(RenderingHints.KEY_INTERPOLATION);
             if (savedInterpolation == null) savedInterpolation = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
-            String interpolation = Main.pref.get("cadastrewms.imageInterpolation", "standard");
+            String interpolation = Config.getPref().get("cadastrewms.imageInterpolation", "standard");
             if (interpolation.equals("bilinear"))
                 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
@@ -362,6 +365,6 @@
         GeorefImage georefImage =
             new GeorefImage(null,
-            Main.getProjection().latlon2eastNorth(bounds.getMin()),
-            Main.getProjection().latlon2eastNorth(bounds.getMax()), this);
+            ProjectionRegistry.getProjection().latlon2eastNorth(bounds.getMin()),
+            ProjectionRegistry.getProjection().latlon2eastNorth(bounds.getMax()), this);
         for (GeorefImage img : images) {
             if (img.overlap(georefImage))
@@ -438,7 +441,7 @@
      */
     public void setRasterBounds(Bounds bounds) {
-        EastNorth rasterCenter = Main.getProjection().latlon2eastNorth(bounds.getCenter());
-        EastNorth eaMin = Main.getProjection().latlon2eastNorth(bounds.getMin());
-        EastNorth eaMax = Main.getProjection().latlon2eastNorth(bounds.getMax());
+        EastNorth rasterCenter = ProjectionRegistry.getProjection().latlon2eastNorth(bounds.getCenter());
+        EastNorth eaMin = ProjectionRegistry.getProjection().latlon2eastNorth(bounds.getMin());
+        EastNorth eaMax = ProjectionRegistry.getProjection().latlon2eastNorth(bounds.getMax());
         double rasterSizeX = communeBBox.max.getX() - communeBBox.min.getX();
         double rasterSizeY = communeBBox.max.getY() - communeBBox.min.getY();
@@ -483,5 +486,6 @@
         currentFormat = ois.readInt();;
         if (currentFormat < 2) {
-            JOptionPane.showMessageDialog(Main.parent, tr("Unsupported cache file version; found {0}, expected {1}\nCreate a new one.",
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
+                    tr("Unsupported cache file version; found {0}, expected {1}\nCreate a new one.",
                     currentFormat, this.serializeFormatVersion), tr("Cache Format Error"), JOptionPane.ERROR_MESSAGE);
             return false;
@@ -509,5 +513,5 @@
         this.communeBBox = new EastNorthBound(new EastNorth(minX, minY), new EastNorth(maxX, maxY));
         if (this.lambertZone != currentLambertZone && currentLambertZone != -1) {
-            JOptionPane.showMessageDialog(Main.parent, tr("Lambert zone {0} in cache "+
+            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Lambert zone {0} in cache "+
                     "incompatible with current Lambert zone {1}",
                     this.lambertZone+1, currentLambertZone), tr("Cache Lambert Zone Error"), JOptionPane.ERROR_MESSAGE);
@@ -668,5 +672,5 @@
 
     private void paintCrosspieces(Graphics g, MapView mv) {
-        String crosspieces = Main.pref.get("cadastrewms.crosspieces", "0");
+        String crosspieces = Config.getPref().get("cadastrewms.crosspieces", "0");
         if (!crosspieces.equals("0")) {
             int modulo = 25;
