Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 12846)
@@ -49,4 +49,5 @@
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -724,5 +725,5 @@
     public static void preConstructorInit() {
         // init default coordinate format
-        ICoordinateFormat fmt = CoordinateFormatManager.getCoordinateFormat(Main.pref.get("coordinates"));
+        ICoordinateFormat fmt = CoordinateFormatManager.getCoordinateFormat(Config.getPref().get("coordinates"));
         if (fmt == null) {
             fmt = DecimalDegreesCoordinateFormat.INSTANCE;
@@ -1007,6 +1008,6 @@
      */
     public static String getJOSMWebsite() {
-        if (Main.pref != null)
-            return Main.pref.get("josm.url", JOSM_WEBSITE);
+        if (Config.getPref() != null)
+            return Config.getPref().get("josm.url", JOSM_WEBSITE);
         return JOSM_WEBSITE;
     }
@@ -1028,6 +1029,6 @@
      */
     public static String getOSMWebsite() {
-        if (Main.pref != null)
-            return Main.pref.get("osm.url", OSM_WEBSITE);
+        if (Config.getPref() != null)
+            return Config.getPref().get("osm.url", OSM_WEBSITE);
         return OSM_WEBSITE;
     }
@@ -1052,6 +1053,6 @@
      */
     public static String getBaseBrowseUrl() {
-        if (Main.pref != null)
-            return Main.pref.get("osm-browse.url", getOSMWebsiteDependingOnSelectedApi());
+        if (Config.getPref() != null)
+            return Config.getPref().get("osm-browse.url", getOSMWebsiteDependingOnSelectedApi());
         return getOSMWebsiteDependingOnSelectedApi();
     }
@@ -1063,6 +1064,6 @@
      */
     public static String getBaseUserUrl() {
-        if (Main.pref != null)
-            return Main.pref.get("osm-user.url", getOSMWebsiteDependingOnSelectedApi() + "/user");
+        if (Config.getPref() != null)
+            return Config.getPref().get("osm-user.url", getOSMWebsiteDependingOnSelectedApi() + "/user");
         return getOSMWebsiteDependingOnSelectedApi() + "/user";
     }
Index: trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 12846)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.gui.dialogs.ValidatorDialog.ValidatorBoundingXYVisitor;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -262,5 +263,5 @@
         if (v.getBounds() == null)
             return null;
-        v.enlargeBoundingBox(Main.pref.getDouble("validator.zoom-enlarge-bbox", 0.0002));
+        v.enlargeBoundingBox(Config.getPref().getDouble("validator.zoom-enlarge-bbox", 0.0002));
         return v;
     }
@@ -314,5 +315,5 @@
         // Make the bounding box at least 100 meter wide to
         // ensure reasonable zoom level when zooming onto single nodes.
-        v.enlargeToMinSize(Main.pref.getDouble("zoom_to_selection_min_size_in_meter", 100));
+        v.enlargeToMinSize(Config.getPref().getDouble("zoom_to_selection_min_size_in_meter", 100));
         return v;
     }
Index: trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 12846)
@@ -21,5 +21,4 @@
 import javax.swing.SwingUtilities;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
 import org.openstreetmap.josm.command.AddCommand;
@@ -43,4 +42,5 @@
 import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -115,5 +115,5 @@
                     SwingUtilities.invokeLater(() -> {
                             MainApplication.getMap().relationListDialog.selectRelation(relation);
-                            if (Main.pref.getBoolean("multipoly.show-relation-editor", false)) {
+                            if (Config.getPref().getBoolean("multipoly.show-relation-editor", false)) {
                                 //Open relation edit window, if set up in preferences
                                 RelationEditor editor = RelationEditor.getEditor(
@@ -382,5 +382,5 @@
 
         // filter out empty key conflicts - we need second iteration
-        if (!Main.pref.getBoolean("multipoly.alltags", false)) {
+        if (!Config.getPref().getBoolean("multipoly.alltags", false)) {
             for (RelationMember m : relation.getMembers()) {
                 if (m.hasRole() && "outer".equals(m.getRole()) && m.isWay()) {
@@ -398,5 +398,5 @@
         }
 
-        for (String linearTag : Main.pref.getList("multipoly.lineartagstokeep", DEFAULT_LINEAR_TAGS)) {
+        for (String linearTag : Config.getPref().getList("multipoly.lineartagstokeep", DEFAULT_LINEAR_TAGS)) {
             values.remove(linearTag);
         }
@@ -408,5 +408,5 @@
 
         List<Command> commands = new ArrayList<>();
-        boolean moveTags = Main.pref.getBoolean("multipoly.movetags", true);
+        boolean moveTags = Config.getPref().getBoolean("multipoly.movetags", true);
 
         for (Entry<String, String> entry : values.entrySet()) {
Index: trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java	(revision 12846)
@@ -8,7 +8,7 @@
 import java.awt.event.KeyEvent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -36,5 +36,5 @@
         );
         putValue("help", ht("/ToggleDialogs"));
-        setSelected(Main.pref.getBoolean("draw.dialogspanel", true));
+        setSelected(Config.getPref().getBoolean("draw.dialogspanel", true));
         notifySelectedState();
     }
@@ -43,5 +43,5 @@
     public void actionPerformed(ActionEvent e) {
         toggleSelectedState(e);
-        Main.pref.putBoolean("draw.dialogspanel", isSelected());
+        Config.getPref().putBoolean("draw.dialogspanel", isSelected());
         notifySelectedState();
         setMode();
@@ -52,17 +52,17 @@
             boolean selected = isSelected();
             if (!selected) {
-                toolbarPreviouslyVisible = Main.pref.getBoolean("toolbar.visible", true);
-                sideToolbarPreviouslyVisible = Main.pref.getBoolean("sidetoolbar.visible", true);
+                toolbarPreviouslyVisible = Config.getPref().getBoolean("toolbar.visible", true);
+                sideToolbarPreviouslyVisible = Config.getPref().getBoolean("sidetoolbar.visible", true);
             }
             MapFrame map = MainApplication.getMap();
             map.setDialogsPanelVisible(selected);
-            map.statusLine.setVisible(selected || Main.pref.getBoolean("statusbar.always-visible", true));
-            MainApplication.getMenu().setVisible(selected || Main.pref.getBoolean("menu.always-visible", true));
+            map.statusLine.setVisible(selected || Config.getPref().getBoolean("statusbar.always-visible", true));
+            MainApplication.getMenu().setVisible(selected || Config.getPref().getBoolean("menu.always-visible", true));
             // Toolbars listen to preference changes, use it here
-            if (!Main.pref.getBoolean("toolbar.always-visible", true) && (!selected || toolbarPreviouslyVisible)) {
-                Main.pref.putBoolean("toolbar.visible", selected);
+            if (!Config.getPref().getBoolean("toolbar.always-visible", true) && (!selected || toolbarPreviouslyVisible)) {
+                Config.getPref().putBoolean("toolbar.visible", selected);
             }
-            if (!Main.pref.getBoolean("sidetoolbar.always-visible", true) && (!selected || sideToolbarPreviouslyVisible)) {
-                Main.pref.putBoolean("sidetoolbar.visible", selected);
+            if (!Config.getPref().getBoolean("sidetoolbar.always-visible", true) && (!selected || sideToolbarPreviouslyVisible)) {
+                Config.getPref().putBoolean("sidetoolbar.visible", selected);
             }
             map.mapView.rememberLastPositionOnScreen();
Index: trunk/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java	(revision 12846)
@@ -22,4 +22,5 @@
 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.Shortcut;
 
@@ -46,5 +47,5 @@
         MainApplication.getToolbar().register(this);
         gd = GraphicsEnvironment.isHeadless() ? null : GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
-        setSelected(Main.pref.getBoolean("draw.fullscreen", false));
+        setSelected(Config.getPref().getBoolean("draw.fullscreen", false));
         notifySelectedState();
     }
@@ -53,5 +54,5 @@
     public void actionPerformed(ActionEvent e) {
         toggleSelectedState(e);
-        Main.pref.putBoolean("draw.fullscreen", isSelected());
+        Config.getPref().putBoolean("draw.fullscreen", isSelected());
         notifySelectedState();
         setMode();
@@ -96,5 +97,5 @@
         // since windows (or java?) draws the undecorated window full-
         // screen by default (it's a simulated mode, but should be ok)
-        String exclusive = Main.pref.get("draw.fullscreen.exclusive-mode", "auto");
+        String exclusive = Config.getPref().get("draw.fullscreen.exclusive-mode", "auto");
         if (("true".equals(exclusive) || ("auto".equals(exclusive) && !Main.isPlatformWindows())) && gd != null) {
             gd.setFullScreenWindow(selected ? frame : null);
Index: trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 12846)
@@ -40,4 +40,5 @@
 import org.openstreetmap.josm.gui.conflict.tags.CombinePrimitiveResolverDialog;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -114,5 +115,5 @@
             return candidates.get(0);
 
-        switch (Main.pref.getInt("merge-nodes.mode", 0)) {
+        switch (Config.getPref().getInt("merge-nodes.mode", 0)) {
         case 0:
             return candidates.get(size - 1);
Index: trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 12846)
@@ -40,4 +40,5 @@
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.MultiMap;
@@ -330,9 +331,9 @@
 
             if (recordHistory) {
-                Collection<String> oldFileHistory = Main.pref.getList("file-open.history");
+                Collection<String> oldFileHistory = Config.getPref().getList("file-open.history");
                 fileHistory.addAll(oldFileHistory);
                 // remove the files which failed to load from the list
                 fileHistory.removeAll(failedAll);
-                int maxsize = Math.max(0, Main.pref.getInt("file-open.history.max-size", 15));
+                int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
                 Main.pref.putCollectionBounded("file-open.history", maxsize, fileHistory);
             }
Index: trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 12846)
@@ -44,4 +44,5 @@
 import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -104,5 +105,5 @@
      */
     protected void restoreUploadAddressHistory(HistoryComboBox cbHistory) {
-        List<String> cmtHistory = new LinkedList<>(Main.pref.getList(getClass().getName() + ".uploadAddressHistory",
+        List<String> cmtHistory = new LinkedList<>(Config.getPref().getList(getClass().getName() + ".uploadAddressHistory",
                 new LinkedList<String>()));
         // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
@@ -118,5 +119,5 @@
     protected void remindUploadAddressHistory(HistoryComboBox cbHistory) {
         cbHistory.addCurrentItemToHistory();
-        Main.pref.putList(getClass().getName() + ".uploadAddressHistory", cbHistory.getHistory());
+        Config.getPref().putList(getClass().getName() + ".uploadAddressHistory", cbHistory.getHistory());
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java	(revision 12846)
@@ -3,5 +3,7 @@
 
 import java.awt.event.ActionEvent;
+
 import javax.swing.JCheckBoxMenuItem;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences;
Index: trunk/src/org/openstreetmap/josm/actions/PurgeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 12846)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -99,5 +100,5 @@
 
             clearUndoRedo = cbClearUndoRedo.isSelected();
-            Main.pref.putBoolean("purge.clear_undo_redo", clearUndoRedo);
+            Config.getPref().putBoolean("purge.clear_undo_redo", clearUndoRedo);
         }
 
@@ -180,5 +181,5 @@
 
         cbClearUndoRedo = new JCheckBox(tr("Clear Undo/Redo buffer"));
-        cbClearUndoRedo.setSelected(Main.pref.getBoolean("purge.clear_undo_redo", false));
+        cbClearUndoRedo.setSelected(Config.getPref().getBoolean("purge.clear_undo_redo", false));
 
         pnl.add(new JSeparator(), GBC.eol().fill(GBC.HORIZONTAL).insets(0, 5, 0, 5));
Index: trunk/src/org/openstreetmap/josm/actions/RenameLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/RenameLayerAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/RenameLayerAction.java	(revision 12846)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -66,5 +67,5 @@
         filerename.setEnabled(file != null);
         if (filerename.isEnabled()) {
-            filerename.setSelected(Main.pref.getBoolean("layer.rename-file", true));
+            filerename.setSelected(Config.getPref().getBoolean("layer.rename-file", true));
         }
 
@@ -81,5 +82,5 @@
         String nameText = name.getText();
         if (filerename.isEnabled()) {
-            Main.pref.putBoolean("layer.rename-file", filerename.isSelected());
+            Config.getPref().putBoolean("layer.rename-file", filerename.isSelected());
             if (filerename.isSelected()) {
                 String newname = nameText;
Index: trunk/src/org/openstreetmap/josm/actions/RestartAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/RestartAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/RestartAction.java	(revision 12846)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.io.SaveLayersDialog;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -95,5 +96,5 @@
         }
         Logging.info("Restart "+cmd);
-        if (Logging.isDebugEnabled() && Main.pref.getBoolean("restart.debug.simulation")) {
+        if (Logging.isDebugEnabled() && Config.getPref().getBoolean("restart.debug.simulation")) {
             Logging.debug("Restart cancelled to get debug info");
             return;
Index: trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 12846)
@@ -16,5 +16,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
@@ -28,4 +27,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -154,5 +154,5 @@
 
         Collection<Command> corrCmds = Collections.<Command>emptyList();
-        if (Main.pref.getBoolean("tag-correction.reverse-way", true)) {
+        if (Config.getPref().getBoolean("tag-correction.reverse-way", true)) {
             corrCmds = (new ReverseWayTagCorrector()).execute(w, wnew);
         }
Index: trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 12846)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -229,6 +230,6 @@
         }
 
-        int maxsize = Math.max(0, Main.pref.getInt("file-open.history.max-size", 15));
-        Collection<String> oldHistory = Main.pref.getList("file-open.history");
+        int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
+        Collection<String> oldHistory = Config.getPref().getList("file-open.history");
         List<String> history = new LinkedList<>(oldHistory);
         history.remove(filepath);
Index: trunk/src/org/openstreetmap/josm/actions/SaveAsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 12846)
@@ -2,6 +2,6 @@
 package org.openstreetmap.josm.actions;
 
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
 import java.awt.event.KeyEvent;
Index: trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 12846)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
 import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -41,5 +42,5 @@
     public void actionPerformed(ActionEvent e) {
         HistoryComboBox searchTermBox = new HistoryComboBox();
-        List<String> searchHistory = new LinkedList<>(Main.pref.getList(HISTORY_KEY, new LinkedList<String>()));
+        List<String> searchHistory = new LinkedList<>(Config.getPref().getList(HISTORY_KEY, new LinkedList<String>()));
         Collections.reverse(searchHistory);
         searchTermBox.setPossibleItems(searchHistory);
@@ -70,5 +71,5 @@
 
         searchTermBox.addCurrentItemToHistory();
-        Main.pref.putList(HISTORY_KEY, searchTermBox.getHistory());
+        Config.getPref().putList(HISTORY_KEY, searchTermBox.getHistory());
 
         performSearch(searchTerm);
@@ -91,6 +92,6 @@
         }
 
-        int noteLimit = Main.pref.getInt("osm.notes.downloadLimit", 1000);
-        int closedLimit = Main.pref.getInt("osm.notes.daysClosed", 7);
+        int noteLimit = Config.getPref().getInt("osm.notes.downloadLimit", 1000);
+        int closedLimit = Config.getPref().getInt("osm.notes.daysClosed", 7);
 
         StringBuilder sb = new StringBuilder(128);
Index: trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 12846)
@@ -30,6 +30,6 @@
 import org.openstreetmap.josm.data.preferences.sources.MapPaintPrefHelper;
 import org.openstreetmap.josm.data.preferences.sources.PresetPrefHelper;
+import org.openstreetmap.josm.data.preferences.sources.SourcePrefHelper;
 import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
-import org.openstreetmap.josm.data.preferences.sources.SourcePrefHelper;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
Index: trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 12846)
@@ -34,4 +34,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -165,5 +166,5 @@
      */
     public final SequenceCommand simplifyWay(Way w) {
-        return simplifyWay(w, Main.pref.getDouble("simplify-way.max-error", 3.0));
+        return simplifyWay(w, Config.getPref().getDouble("simplify-way.max-error", 3.0));
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java	(revision 12846)
@@ -10,8 +10,8 @@
 import java.io.IOException;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.io.audio.AudioPlayer;
 import org.openstreetmap.josm.io.audio.AudioUtil;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -36,5 +36,5 @@
             if (AudioPlayer.playing() || AudioPlayer.paused())
                 AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position()
-                - Main.pref.getDouble("audio.forwardbackamount", 10.0));
+                - Config.getPref().getDouble("audio.forwardbackamount", 10.0));
             else
                 MarkerLayer.playAudio();
Index: trunk/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java	(revision 12846)
@@ -5,7 +5,7 @@
 import java.io.IOException;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.audio.AudioPlayer;
 import org.openstreetmap.josm.io.audio.AudioUtil;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -29,5 +29,5 @@
     public AudioFastSlowAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean fast) {
         super(name, iconName, tooltip, shortcut, true);
-        multiplier = Main.pref.getDouble("audio.fastfwdmultiplier", 1.3);
+        multiplier = Config.getPref().getDouble("audio.fastfwdmultiplier", 1.3);
         if (!fast)
             multiplier = 1.0 / multiplier;
Index: trunk/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java	(revision 12846)
@@ -9,8 +9,8 @@
 import java.io.IOException;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.io.audio.AudioPlayer;
 import org.openstreetmap.josm.io.audio.AudioUtil;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -34,5 +34,5 @@
             if (AudioPlayer.playing() || AudioPlayer.paused())
                 AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position()
-                + Main.pref.getDouble("audio.forwardbackamount", 10.0));
+                + Config.getPref().getDouble("audio.forwardbackamount", 10.0));
             else
                 MarkerLayer.playAudio();
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 12846)
@@ -13,5 +13,4 @@
 import java.util.stream.Stream;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Bounds.ParseMethod;
@@ -35,4 +34,5 @@
 import org.openstreetmap.josm.io.OsmServerReader;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.xml.sax.SAXException;
@@ -169,5 +169,5 @@
 
         private GpxLayer findGpxMergeLayer() {
-            boolean merge = Main.pref.getBoolean("download.gps.mergeWithLocal", false);
+            boolean merge = Config.getPref().getBoolean("download.gps.mergeWithLocal", false);
             Layer active = MainApplication.getLayerManager().getActiveLayer();
             if (active instanceof GpxLayer && (merge || ((GpxLayer) active).data.fromServer))
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java	(revision 12846)
@@ -9,9 +9,9 @@
 import java.util.concurrent.Future;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.SessionLoadAction.Loader;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.Logging;
@@ -78,5 +78,5 @@
     @Override
     public boolean isSafeForRemotecontrolRequests() {
-        return Main.pref.getBoolean("remotecontrol.import.allow_session", false);
+        return Config.getPref().getBoolean("remotecontrol.import.allow_session", false);
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 12846)
@@ -13,5 +13,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
@@ -30,4 +29,5 @@
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.util.ModifierExListener;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -111,5 +111,5 @@
             return;
 
-        drawTargetHighlight = Main.pref.getBoolean("draw.target-highlight", true);
+        drawTargetHighlight = Config.getPref().getBoolean("draw.target-highlight", true);
 
         MapFrame map = MainApplication.getMap();
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java	(revision 12846)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.gui.draw.SymbolShape;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -237,5 +238,5 @@
 
     private void computeSnapAngles() {
-        snapAngles = Main.pref.getList(DRAW_ANGLESNAP_ANGLES,
+        snapAngles = Config.getPref().getList(DRAW_ANGLESNAP_ANGLES,
                 Arrays.asList("0", "30", "45", "60", "90", "120", "135", "150", "180"))
                 .stream()
@@ -259,5 +260,5 @@
      */
     public void saveAngles(String... angles) {
-        Main.pref.putList(DRAW_ANGLESNAP_ANGLES, Arrays.asList(angles));
+        Config.getPref().putList(DRAW_ANGLESNAP_ANGLES, Arrays.asList(angles));
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 12846)
@@ -58,4 +58,5 @@
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
 import org.openstreetmap.josm.gui.util.ModifierExListener;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -307,19 +308,19 @@
     @Override
     protected void readPreferences() {
-        initialMoveDelay = Main.pref.getInt("edit.initial-move-delay", 200);
-        initialMoveThreshold = Main.pref.getInt("extrude.initial-move-threshold", 1);
+        initialMoveDelay = Config.getPref().getInt("edit.initial-move-delay", 200);
+        initialMoveThreshold = Config.getPref().getInt("extrude.initial-move-threshold", 1);
         mainColor = new ColorProperty(marktr("Extrude: main line"), Color.RED).get();
         helperColor = new ColorProperty(marktr("Extrude: helper line"), Color.ORANGE).get();
-        helperStrokeDash = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.stroke.helper-line", "1 4"));
+        helperStrokeDash = GuiHelper.getCustomizedStroke(Config.getPref().get("extrude.stroke.helper-line", "1 4"));
         helperStrokeRA = new BasicStroke(1);
-        symbolSize = Main.pref.getDouble("extrude.angle-symbol-radius", 8);
-        nodeDragWithoutCtrl = Main.pref.getBoolean("extrude.drag-nodes-without-ctrl", false);
-        oldLineStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.ctrl.stroke.old-line", "1"));
-        mainStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.stroke.main", "3"));
-
-        ignoreSharedNodes = Main.pref.getBoolean("extrude.ignore-shared-nodes", true);
+        symbolSize = Config.getPref().getDouble("extrude.angle-symbol-radius", 8);
+        nodeDragWithoutCtrl = Config.getPref().getBoolean("extrude.drag-nodes-without-ctrl", false);
+        oldLineStroke = GuiHelper.getCustomizedStroke(Config.getPref().get("extrude.ctrl.stroke.old-line", "1"));
+        mainStroke = GuiHelper.getCustomizedStroke(Config.getPref().get("extrude.stroke.main", "3"));
+
+        ignoreSharedNodes = Config.getPref().getBoolean("extrude.ignore-shared-nodes", true);
         dualAlignCheckboxMenuItem.getAction().setEnabled(true);
-        useRepeatedShortcut = Main.pref.getBoolean("extrude.dualalign.toggleOnRepeatedX", true);
-        keepSegmentDirection = Main.pref.getBoolean("extrude.dualalign.keep-segment-direction", true);
+        useRepeatedShortcut = Config.getPref().getBoolean("extrude.dualalign.toggleOnRepeatedX", true);
+        keepSegmentDirection = Config.getPref().getBoolean("extrude.dualalign.keep-segment-direction", true);
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 12846)
@@ -11,5 +11,4 @@
 import java.util.Collections;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
@@ -19,4 +18,5 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -98,5 +98,5 @@
     public void enterMode() {
         putValue("active", Boolean.TRUE);
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
         readPreferences();
         MainApplication.getMap().mapView.setNewCursor(cursor, this);
@@ -109,5 +109,5 @@
     public void exitMode() {
         putValue("active", Boolean.FALSE);
-        Main.pref.removePreferenceChangeListener(this);
+        Config.getPref().removePreferenceChangeListener(this);
         MainApplication.getMap().mapView.resetCursor(this);
     }
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 12846)
@@ -51,4 +51,5 @@
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
 import org.openstreetmap.josm.gui.util.ModifierExListener;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -202,9 +203,9 @@
         mv.addMouseListener(this);
         mv.addMouseMotionListener(this);
-        mv.setVirtualNodesEnabled(Main.pref.getInt("mappaint.node.virtual-size", 8) != 0);
-        drawTargetHighlight = Main.pref.getBoolean("draw.target-highlight", true);
-        initialMoveDelay = Main.pref.getInt("edit.initial-move-delay", 200);
-        initialMoveThreshold = Main.pref.getInt("edit.initial-move-threshold", 5);
-        repeatedKeySwitchLassoOption = Main.pref.getBoolean("mappaint.select.toggle-lasso-on-repeated-S", true);
+        mv.setVirtualNodesEnabled(Config.getPref().getInt("mappaint.node.virtual-size", 8) != 0);
+        drawTargetHighlight = Config.getPref().getBoolean("draw.target-highlight", true);
+        initialMoveDelay = Config.getPref().getInt("edit.initial-move-delay", 200);
+        initialMoveThreshold = Config.getPref().getInt("edit.initial-move-threshold", 5);
+        repeatedKeySwitchLassoOption = Config.getPref().getBoolean("mappaint.select.toggle-lasso-on-repeated-S", true);
         cycleManager.init();
         virtualManager.init();
@@ -828,5 +829,5 @@
             }
         }
-        int max = Main.pref.getInt("warn.move.maxelements", 20), limit = max;
+        int max = Config.getPref().getInt("warn.move.maxelements", 20), limit = max;
         for (OsmPrimitive osm : getLayerManager().getEditDataSet().getSelected()) {
             if (osm instanceof Way) {
@@ -1039,6 +1040,6 @@
          */
         private void init() {
-            waitForMouseUpParameter = Main.pref.getBoolean("mappaint.select.waits-for-mouse-up", false);
-            multipleMatchesParameter = Main.pref.getBoolean("selectaction.cycles.multiple.matches", false);
+            waitForMouseUpParameter = Config.getPref().getBoolean("mappaint.select.waits-for-mouse-up", false);
+            multipleMatchesParameter = Config.getPref().getBoolean("selectaction.cycles.multiple.matches", false);
         }
 
@@ -1175,8 +1176,8 @@
 
         private void init() {
-            nodeVirtualSize = Main.pref.getInt("mappaint.node.virtual-size", 8);
-            int virtualSnapDistSq = Main.pref.getInt("mappaint.node.virtual-snap-distance", 8);
+            nodeVirtualSize = Config.getPref().getInt("mappaint.node.virtual-size", 8);
+            int virtualSnapDistSq = Config.getPref().getInt("mappaint.node.virtual-snap-distance", 8);
             virtualSnapDistSq2 = virtualSnapDistSq*virtualSnapDistSq;
-            virtualSpace = Main.pref.getInt("mappaint.node.virtual-space", 70);
+            virtualSpace = Config.getPref().getInt("mappaint.node.virtual-space", 70);
         }
 
Index: trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java	(revision 12846)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -70,5 +71,5 @@
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled() || relations.isEmpty()) return;
-        if (relations.size() > Main.pref.getInt("warn.open.maxrelations", 5) &&
+        if (relations.size() > Config.getPref().getInt("warn.open.maxrelations", 5) &&
             /* I18N english text for value 1 makes no real sense, never called for values <= maxrel (usually 5) */
             JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent,
Index: trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 12846)
@@ -67,4 +67,5 @@
 import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -112,5 +113,5 @@
         });
 
-        for (String s: Main.pref.getList("search.history", Collections.<String>emptyList())) {
+        for (String s: Config.getPref().getList("search.history", Collections.<String>emptyList())) {
             SearchSetting ss = SearchSetting.readFromString(s);
             if (ss != null) {
@@ -140,5 +141,5 @@
             searchHistory.addFirst(new SearchSetting(s));
         }
-        int maxsize = Main.pref.getInt("search.history-size", DEFAULT_SEARCH_HISTORY_SIZE);
+        int maxsize = Config.getPref().getInt("search.history-size", DEFAULT_SEARCH_HISTORY_SIZE);
         while (searchHistory.size() > maxsize) {
             searchHistory.removeLast();
@@ -148,5 +149,5 @@
             savedHistory.add(item.writeToString());
         }
-        Main.pref.putList("search.history", new ArrayList<>(savedHistory));
+        Config.getPref().putList("search.history", new ArrayList<>(savedHistory));
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/upload/FixDataHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/upload/FixDataHook.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/actions/upload/FixDataHook.java	(revision 12846)
@@ -12,5 +12,4 @@
 import java.util.Map.Entry;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -21,4 +20,5 @@
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -187,5 +187,5 @@
     @Override
     public boolean checkUpload(APIDataSet apiDataSet) {
-        if (Main.pref.getBoolean("fix.data.on.upload", true)) {
+        if (Config.getPref().getBoolean("fix.data.on.upload", true)) {
             Collection<Command> cmds = new LinkedList<>();
 
Index: trunk/src/org/openstreetmap/josm/command/PurgeCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/PurgeCommand.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/command/PurgeCommand.java	(revision 12846)
@@ -16,5 +16,4 @@
 import javax.swing.Icon;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
@@ -32,4 +31,5 @@
 import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -384,5 +384,5 @@
 
         // Add untagged way nodes. Do not add nodes that have other referrers not yet to-be-purged.
-        if (Main.pref.getBoolean("purge.add_untagged_waynodes", true)) {
+        if (Config.getPref().getBoolean("purge.add_untagged_waynodes", true)) {
             Set<OsmPrimitive> wayNodes = new HashSet<>();
             for (OsmPrimitive osm : toPurgeChecked) {
@@ -409,5 +409,5 @@
         }
 
-        if (Main.pref.getBoolean("purge.add_relations_with_only_incomplete_members", true)) {
+        if (Config.getPref().getBoolean("purge.add_relations_with_only_incomplete_members", true)) {
             Set<Relation> relSet = new HashSet<>();
             for (OsmPrimitive osm : toPurgeChecked) {
Index: trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java	(revision 12846)
@@ -17,5 +17,4 @@
 import java.util.function.Consumer;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.Node;
@@ -25,4 +24,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -273,5 +273,5 @@
 
         Collection<Command> commandList = new ArrayList<>(newWays.size());
-        Collection<String> nowarnroles = Main.pref.getList("way.split.roles.nowarn",
+        Collection<String> nowarnroles = Config.getPref().getList("way.split.roles.nowarn",
                 Arrays.asList("outer", "inner", "forward", "backward", "north", "south", "east", "west"));
 
Index: trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 12846)
@@ -12,6 +12,6 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.StringProperty;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -230,5 +230,5 @@
     public String getDistText(final double dist, final NumberFormat format, final double threshold) {
         double a = dist / aValue;
-        if (a > bValue / aValue && !Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false))
+        if (a > bValue / aValue && !Config.getPref().getBoolean("system_of_measurement.use_only_lower_unit", false))
             return formatText(dist / bValue, bName, format);
         else if (a < threshold)
@@ -258,6 +258,6 @@
     public String getAreaText(final double area, final NumberFormat format, final double threshold) {
         double a = area / (aValue*aValue);
-        boolean lowerOnly = Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false);
-        boolean customAreaOnly = Main.pref.getBoolean("system_of_measurement.use_only_custom_area_unit", false);
+        boolean lowerOnly = Config.getPref().getBoolean("system_of_measurement.use_only_lower_unit", false);
+        boolean customAreaOnly = Config.getPref().getBoolean("system_of_measurement.use_only_custom_area_unit", false);
         if ((!lowerOnly && areaCustomValue > 0 && a > areaCustomValue / (aValue*aValue)
                 && a < (bValue*bValue) / (aValue*aValue)) || customAreaOnly)
Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 12846)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -74,5 +75,5 @@
         // Currently you have to undo the commands one by one. If
         // this changes, a higher default value may be reasonable.
-        if (commands.size() > Main.pref.getInt("undo.max", 1000)) {
+        if (commands.size() > Config.getPref().getInt("undo.max", 1000)) {
             commands.removeFirst();
         }
Index: trunk/src/org/openstreetmap/josm/data/UserIdentityManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UserIdentityManager.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/UserIdentityManager.java	(revision 12846)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -77,5 +78,5 @@
                 instance.initFromPreferences();
             }
-            Main.pref.addPreferenceChangeListener(instance);
+            Config.getPref().addPreferenceChangeListener(instance);
         }
         return instance;
Index: trunk/src/org/openstreetmap/josm/data/coor/conversion/DMSCoordinateFormat.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/coor/conversion/DMSCoordinateFormat.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/coor/conversion/DMSCoordinateFormat.java	(revision 12846)
@@ -6,6 +6,6 @@
 import java.text.DecimalFormat;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.ILatLon;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -17,5 +17,5 @@
     private static final DecimalFormat DMS_MINUTE_FORMATTER = new DecimalFormat("00");
     private static final DecimalFormat DMS_SECOND_FORMATTER = new DecimalFormat(
-            Main.pref == null ? "00.0" : Main.pref.get("latlon.dms.decimal-format", "00.0"));
+            Config.getPref() == null ? "00.0" : Config.getPref().get("latlon.dms.decimal-format", "00.0"));
     private static final String DMS60 = DMS_SECOND_FORMATTER.format(60.0);
     private static final String DMS00 = DMS_SECOND_FORMATTER.format(0.0);
Index: trunk/src/org/openstreetmap/josm/data/coor/conversion/NauticalCoordinateFormat.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/coor/conversion/NauticalCoordinateFormat.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/coor/conversion/NauticalCoordinateFormat.java	(revision 12846)
@@ -6,6 +6,6 @@
 import java.text.DecimalFormat;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.ILatLon;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -15,5 +15,5 @@
 public class NauticalCoordinateFormat extends AbstractCoordinateFormat {
     private static final DecimalFormat DM_MINUTE_FORMATTER = new DecimalFormat(
-            Main.pref == null ? "00.000" : Main.pref.get("latlon.dm.decimal-format", "00.000"));
+            Config.getPref() == null ? "00.000" : Config.getPref().get("latlon.dm.decimal-format", "00.000"));
     private static final String DM60 = DM_MINUTE_FORMATTER.format(60.0);
     private static final String DM00 = DM_MINUTE_FORMATTER.format(0.0);
Index: trunk/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java	(revision 12846)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
 import org.openstreetmap.josm.data.preferences.StringProperty;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -72,6 +73,6 @@
 
         return getLoader(listener, cache,
-                (int) TimeUnit.SECONDS.toMillis(Main.pref.getInt("socket.timeout.connect", 15)),
-                (int) TimeUnit.SECONDS.toMillis(Main.pref.getInt("socket.timeout.read", 30)),
+                (int) TimeUnit.SECONDS.toMillis(Config.getPref().getInt("socket.timeout.connect", 15)),
+                (int) TimeUnit.SECONDS.toMillis(Config.getPref().getInt("socket.timeout.read", 30)),
                 headers);
     }
Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 12846)
@@ -26,9 +26,9 @@
 import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource.Mapnik;
 import org.openstreetmap.gui.jmapviewer.tilesources.TileSourceInfo;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences.pref;
 import org.openstreetmap.josm.io.Capabilities;
 import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -817,7 +817,7 @@
     public void clearId() {
         if (this.id != null) {
-            Collection<String> newAddedIds = new TreeSet<>(Main.pref.getList("imagery.layers.addedIds"));
+            Collection<String> newAddedIds = new TreeSet<>(Config.getPref().getList("imagery.layers.addedIds"));
             newAddedIds.add(this.id);
-            Main.pref.putList("imagery.layers.addedIds", new ArrayList<>(newAddedIds));
+            Config.getPref().putList("imagery.layers.addedIds", new ArrayList<>(newAddedIds));
         }
         setId(null);
Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 12846)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.io.imagery.ImageryReader;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -57,5 +58,5 @@
      */
     public static Collection<String> getImageryLayersSites() {
-        return Main.pref.getList("imagery.layers.sites", Arrays.asList(DEFAULT_LAYER_SITES));
+        return Config.getPref().getList("imagery.layers.sites", Arrays.asList(DEFAULT_LAYER_SITES));
     }
 
@@ -236,5 +237,5 @@
         // add new default entries to the user selection
         boolean changed = false;
-        Collection<String> knownDefaults = new TreeSet<>(Main.pref.getList("imagery.layers.default"));
+        Collection<String> knownDefaults = new TreeSet<>(Config.getPref().getList("imagery.layers.default"));
         Collection<String> newKnownDefaults = new TreeSet<>();
         for (ImageryInfo def : defaultLayers) {
@@ -279,5 +280,5 @@
             newKnownDefaults.addAll(knownDefaults);
         }
-        Main.pref.putList("imagery.layers.default", new ArrayList<>(newKnownDefaults));
+        Config.getPref().putList("imagery.layers.default", new ArrayList<>(newKnownDefaults));
 
         // automatically update user entries with same id as a default entry
Index: trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 12846)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -177,6 +178,5 @@
     // migration code - remove Nov. 2017
     private static void loadBookmarksOld() {
-        for (Collection<String> c : Main.pref.getArray("imagery.offsets",
-                Collections.<Collection<String>>emptySet())) {
+        for (Collection<String> c : Config.getPref().getListOfLists("imagery.offsets")) {
             allBookmarks.add(new OffsetBookmark(c));
         }
Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 12846)
@@ -12,8 +12,8 @@
 import java.util.stream.Collectors;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.UserIdentityManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 
@@ -45,5 +45,5 @@
      */
     private ChangesetCache() {
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/DefaultNameFormatter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DefaultNameFormatter.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/DefaultNameFormatter.java	(revision 12846)
@@ -21,5 +21,4 @@
 import java.util.stream.Collectors;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.conversion.CoordinateFormatManager;
@@ -31,4 +30,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetNameTemplateList;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.I18n;
@@ -105,5 +105,5 @@
         if (namingTagsForRelations == null) {
             namingTagsForRelations = new ArrayList<>(
-                    Main.pref.getList("relation.nameOrder", Arrays.asList(DEFAULT_NAMING_TAGS_FOR_RELATIONS))
+                    Config.getPref().getList("relation.nameOrder", Arrays.asList(DEFAULT_NAMING_TAGS_FOR_RELATIONS))
                     );
         }
@@ -119,6 +119,6 @@
      */
     protected void decorateNameWithId(StringBuilder name, IPrimitive primitive) {
-        if (Main.pref.getBoolean("osm-primitives.showid")) {
-            if (Main.pref.getBoolean("osm-primitives.showid.new-primitives")) {
+        if (Config.getPref().getBoolean("osm-primitives.showid")) {
+            if (Config.getPref().getBoolean("osm-primitives.showid.new-primitives")) {
                 name.append(tr(" [id: {0}]", primitive.getUniqueId()));
             } else {
@@ -155,5 +155,5 @@
             if (preset == null) {
                 String n;
-                if (Main.pref.getBoolean("osm-primitives.localize-name", true)) {
+                if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
                     n = node.getLocalName();
                 } else {
@@ -233,5 +233,5 @@
             if (preset == null) {
                 String n;
-                if (Main.pref.getBoolean("osm-primitives.localize-name", true)) {
+                if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
                     n = way.getLocalName();
                 } else {
@@ -433,5 +433,5 @@
     private static String getNameTagValue(IRelation relation, String nameTag) {
         if ("name".equals(nameTag)) {
-            if (Main.pref.getBoolean("osm-primitives.localize-name", true))
+            if (Config.getPref().getBoolean("osm-primitives.localize-name", true))
                 return relation.getLocalName();
             else
@@ -519,5 +519,5 @@
      */
     protected void decorateNameWithId(StringBuilder name, HistoryOsmPrimitive primitive) {
-        if (Main.pref.getBoolean("osm-primitives.showid")) {
+        if (Config.getPref().getBoolean("osm-primitives.showid")) {
             name.append(tr(" [id: {0}]", primitive.getId()));
         }
@@ -528,5 +528,5 @@
         StringBuilder sb = new StringBuilder();
         String name;
-        if (Main.pref.getBoolean("osm-primitives.localize-name", true)) {
+        if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
             name = node.getLocalName();
         } else {
@@ -554,5 +554,5 @@
         StringBuilder sb = new StringBuilder();
         String name;
-        if (Main.pref.getBoolean("osm-primitives.localize-name", true)) {
+        if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
             name = way.getLocalName();
         } else {
@@ -601,5 +601,5 @@
             // #3328: "note " and " note" are name tags too
             if (namingTags.contains(n.trim())) {
-                if (Main.pref.getBoolean("osm-primitives.localize-name", true)) {
+                if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
                     nameTag = relation.getLocalName();
                 } else {
Index: trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 12846)
@@ -6,9 +6,9 @@
 import java.util.List;
 
-import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
-import org.openstreetmap.josm.data.osm.search.SearchMode;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler.Match;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler.Not;
+import org.openstreetmap.josm.data.osm.search.SearchMode;
+import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 12846)
@@ -20,5 +20,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler.Match;
@@ -26,4 +25,5 @@
 import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
 import org.openstreetmap.josm.gui.mappaint.StyleCache;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -650,5 +650,5 @@
             l.addAll(getDiscardableKeys());
             l.addAll(getWorkInProgressKeys());
-            uninteresting = new HashSet<>(Main.pref.getList("tags.uninteresting", l));
+            uninteresting = new HashSet<>(Config.getPref().getList("tags.uninteresting", l));
         }
         return uninteresting;
@@ -662,5 +662,5 @@
     public static Collection<String> getDiscardableKeys() {
         if (discardable == null) {
-            discardable = new HashSet<>(Main.pref.getList("tags.discardable",
+            discardable = new HashSet<>(Config.getPref().getList("tags.discardable",
                     Arrays.asList(
                             "created_by",
@@ -720,5 +720,5 @@
     public static Collection<String> getWorkInProgressKeys() {
         if (workinprogress == null) {
-            workinprogress = new HashSet<>(Main.pref.getList("tags.workinprogress",
+            workinprogress = new HashSet<>(Config.getPref().getList("tags.workinprogress",
                     Arrays.asList("note", "fixme", "FIXME")));
         }
@@ -760,5 +760,5 @@
     private static Match compileDirectionKeys(String prefName, String defaultValue) throws AssertionError {
         try {
-            return SearchCompiler.compile(Main.pref.get(prefName, defaultValue));
+            return SearchCompiler.compile(Config.getPref().get(prefName, defaultValue));
         } catch (SearchParseError e) {
             Logging.log(Logging.LEVEL_ERROR, "Unable to compile pattern for " + prefName + ", trying default pattern:", e);
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 12846)
@@ -13,7 +13,7 @@
 import java.util.stream.Collectors;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CopyList;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
@@ -507,5 +507,5 @@
                                     getPrimitiveId(), rm.getMember().getPrimitiveId()));
             }
-            if (Main.pref.getBoolean("debug.checkDeleteReferenced", true)) {
+            if (Config.getPref().getBoolean("debug.checkDeleteReferenced", true)) {
                 for (RelationMember rm: members) {
                     if (rm.getMember().isDeleted())
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 12846)
@@ -11,8 +11,8 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CopyList;
 import org.openstreetmap.josm.tools.Pair;
@@ -609,5 +609,5 @@
                                     DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>");
             }
-            if (Main.pref.getBoolean("debug.checkNullCoor", true)) {
+            if (Config.getPref().getBoolean("debug.checkNullCoor", true)) {
                 for (Node n: nodes) {
                     if (n.isVisible() && !n.isIncomplete() && !n.isLatLonKnown())
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java	(revision 12846)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -126,5 +127,5 @@
      */
     public void enlargeBoundingBox() {
-        enlargeBoundingBox(Main.pref.getDouble("edit.zoom-enlarge-bbox", 0.002));
+        enlargeBoundingBox(Config.getPref().getDouble("edit.zoom-enlarge-bbox", 0.002));
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 12846)
@@ -9,5 +9,4 @@
 import java.util.Iterator;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -19,4 +18,5 @@
 import org.openstreetmap.josm.gui.MapViewState.MapViewRectangle;
 import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -182,7 +182,7 @@
      */
     protected void getSettings(boolean virtual) {
-        this.virtualNodeSize = virtual ? Main.pref.getInt("mappaint.node.virtual-size", 8) / 2 : 0;
-        this.virtualNodeSpace = Main.pref.getInt("mappaint.node.virtual-space", 70);
-        this.segmentNumberSpace = Main.pref.getInt("mappaint.segmentnumber.space", 40);
+        this.virtualNodeSize = virtual ? Config.getPref().getInt("mappaint.node.virtual-size", 8) / 2 : 0;
+        this.virtualNodeSpace = Config.getPref().getInt("mappaint.node.virtual-space", 70);
+        this.segmentNumberSpace = Config.getPref().getInt("mappaint.segmentnumber.space", 40);
         getColors();
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/ComputeStyleListWorker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/ComputeStyleListWorker.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/ComputeStyleListWorker.java	(revision 12846)
@@ -8,5 +8,4 @@
 import java.util.concurrent.RecursiveTask;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -25,4 +24,5 @@
 import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
 import org.openstreetmap.josm.gui.mappaint.styleelement.TextElement;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.bugreport.BugReport;
@@ -60,7 +60,7 @@
         this.output = output;
         this.directExecutionTaskSize = directExecutionTaskSize;
-        this.drawArea = circum <= Main.pref.getInt("mappaint.fillareas", 10_000_000);
-        this.drawMultipolygon = drawArea && Main.pref.getBoolean("mappaint.multipolygon", true);
-        this.drawRestriction = Main.pref.getBoolean("mappaint.restriction", true);
+        this.drawArea = circum <= Config.getPref().getInt("mappaint.fillareas", 10_000_000);
+        this.drawMultipolygon = drawArea && Config.getPref().getBoolean("mappaint.multipolygon", true);
+        this.drawRestriction = Config.getPref().getBoolean("mappaint.restriction", true);
         this.styles.setDrawMultipolygon(drawMultipolygon);
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java	(revision 12846)
@@ -4,7 +4,7 @@
 import java.awt.Color;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -69,12 +69,12 @@
     private MapPaintSettings() {
         load();
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
     }
 
     private void load() {
-        showDirectionArrow = Main.pref.getBoolean("draw.segment.direction", false);
-        showOnewayArrow = Main.pref.getBoolean("draw.oneway", true);
-        useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth", false);
-        defaultSegmentWidth = Main.pref.getInt("mappaint.segment.default-width", 2);
+        showDirectionArrow = Config.getPref().getBoolean("draw.segment.direction", false);
+        showOnewayArrow = Config.getPref().getBoolean("draw.oneway", true);
+        useRealWidth = Config.getPref().getBoolean("mappaint.useRealWidth", false);
+        defaultSegmentWidth = Config.getPref().getInt("mappaint.segment.default-width", 2);
 
         selectedColor = PaintColors.SELECTED.get();
@@ -91,22 +91,22 @@
         }
 
-        showOrderNumber = Main.pref.getBoolean("draw.segment.order_number", false);
-        showOrderNumberOnSelectedWay = Main.pref.getBoolean("draw.segment.order_number.on_selected", false);
-        showHeadArrowOnly = Main.pref.getBoolean("draw.segment.head_only", false);
-
-        showNamesDistance = Main.pref.getInt("mappaint.shownames", 10_000_000);
-        useStrokesDistance = Main.pref.getInt("mappaint.strokes", 10_000_000);
-        showIconsDistance = Main.pref.getInt("mappaint.showicons", 10_000_000);
-
-        selectedNodeSize = Main.pref.getInt("mappaint.node.selected-size", 5);
-        unselectedNodeSize = Main.pref.getInt("mappaint.node.unselected-size", 3);
-        connectionNodeSize = Main.pref.getInt("mappaint.node.connection-size", 5);
-        taggedNodeSize = Main.pref.getInt("mappaint.node.tagged-size", 3);
-        fillSelectedNode = Main.pref.getBoolean("mappaint.node.fill-selected", true);
-        fillUnselectedNode = Main.pref.getBoolean("mappaint.node.fill-unselected", false);
-        fillTaggedNode = Main.pref.getBoolean("mappaint.node.fill-tagged", true);
-        fillConnectionNode = Main.pref.getBoolean("mappaint.node.fill-connection", false);
-
-        outlineOnly = Main.pref.getBoolean("draw.data.area_outline_only", false);
+        showOrderNumber = Config.getPref().getBoolean("draw.segment.order_number", false);
+        showOrderNumberOnSelectedWay = Config.getPref().getBoolean("draw.segment.order_number.on_selected", false);
+        showHeadArrowOnly = Config.getPref().getBoolean("draw.segment.head_only", false);
+
+        showNamesDistance = Config.getPref().getInt("mappaint.shownames", 10_000_000);
+        useStrokesDistance = Config.getPref().getInt("mappaint.strokes", 10_000_000);
+        showIconsDistance = Config.getPref().getInt("mappaint.showicons", 10_000_000);
+
+        selectedNodeSize = Config.getPref().getInt("mappaint.node.selected-size", 5);
+        unselectedNodeSize = Config.getPref().getInt("mappaint.node.unselected-size", 3);
+        connectionNodeSize = Config.getPref().getInt("mappaint.node.connection-size", 5);
+        taggedNodeSize = Config.getPref().getInt("mappaint.node.tagged-size", 3);
+        fillSelectedNode = Config.getPref().getBoolean("mappaint.node.fill-selected", true);
+        fillUnselectedNode = Config.getPref().getBoolean("mappaint.node.fill-unselected", false);
+        fillTaggedNode = Config.getPref().getBoolean("mappaint.node.fill-tagged", true);
+        fillConnectionNode = Config.getPref().getBoolean("mappaint.node.fill-connection", false);
+
+        outlineOnly = Config.getPref().getBoolean("draw.data.area_outline_only", false);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java	(revision 12846)
@@ -13,7 +13,7 @@
 import java.util.List;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.plugins.PluginHandler;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -151,5 +151,5 @@
     private MapRendererFactory() {
         registerDefaultRenderers();
-        String rendererClassName = Main.pref.get(PREF_KEY_RENDERER_CLASS_NAME, null);
+        String rendererClassName = Config.getPref().get(PREF_KEY_RENDERER_CLASS_NAME, null);
         if (rendererClassName != null) {
             activateMapRenderer(rendererClassName);
@@ -274,5 +274,5 @@
             );
         this.activeRenderer = renderer;
-        Main.pref.put(PREF_KEY_RENDERER_CLASS_NAME, activeRenderer.getName());
+        Config.getPref().put(PREF_KEY_RENDERER_CLASS_NAME, activeRenderer.getName());
 
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java	(revision 12846)
@@ -6,7 +6,7 @@
 import java.util.function.Supplier;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer.StyleRecord;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -148,5 +148,5 @@
      */
     public static Supplier<RenderBenchmarkCollector> defaultBenchmarkSupplier() {
-        return () -> Logging.isTraceEnabled() || Main.pref.getBoolean("mappaint.render.benchmark", false)
+        return () -> Logging.isTraceEnabled() || Config.getPref().getBoolean("mappaint.render.benchmark", false)
                 ? new LoggingBenchmark() : new RenderBenchmarkCollector();
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 12846)
@@ -43,5 +43,4 @@
 import javax.swing.FocusManager;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -76,11 +75,12 @@
 import org.openstreetmap.josm.gui.mappaint.styleelement.TextLabel;
 import org.openstreetmap.josm.gui.mappaint.styleelement.placement.PositionForAreaStrategy;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CompositeList;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Geometry.AreaAndPerimeter;
+import org.openstreetmap.josm.tools.HiDPISupport;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.HiDPISupport;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.bugreport.BugReport;
@@ -236,5 +236,5 @@
         if (cached != null)
             return cached;
-        String overridePref = Main.pref.get("glyph-bug", "auto");
+        String overridePref = Config.getPref().get("glyph-bug", "auto");
         if ("auto".equals(overridePref)) {
             FontRenderContext frc = new FontRenderContext(null, false, false);
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java	(revision 12846)
@@ -16,5 +16,4 @@
 import java.util.List;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.osm.BBox;
@@ -31,4 +30,5 @@
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.draw.MapPath2D;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -147,5 +147,5 @@
 
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-                Main.pref.getBoolean("mappaint.wireframe.use-antialiasing", false) ?
+                Config.getPref().getBoolean("mappaint.wireframe.use-antialiasing", false) ?
                         RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 12846)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData.Intersection;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Geometry.AreaAndPerimeter;
@@ -96,19 +97,19 @@
         private void initFromPreferences() {
             initDefaults();
-            if (Main.pref == null) return;
+            if (Config.getPref() == null) return;
             Collection<String> literals;
-            literals = Main.pref.getList(PREF_KEY_OUTER_ROLES);
+            literals = Config.getPref().getList(PREF_KEY_OUTER_ROLES);
             if (literals != null && !literals.isEmpty()) {
                 setNormalized(literals, outerExactRoles);
             }
-            literals = Main.pref.getList(PREF_KEY_OUTER_ROLE_PREFIXES);
+            literals = Config.getPref().getList(PREF_KEY_OUTER_ROLE_PREFIXES);
             if (literals != null && !literals.isEmpty()) {
                 setNormalized(literals, outerRolePrefixes);
             }
-            literals = Main.pref.getList(PREF_KEY_INNER_ROLES);
+            literals = Config.getPref().getList(PREF_KEY_INNER_ROLES);
             if (literals != null && !literals.isEmpty()) {
                 setNormalized(literals, innerExactRoles);
             }
-            literals = Main.pref.getList(PREF_KEY_INNER_ROLE_PREFIXES);
+            literals = Config.getPref().getList(PREF_KEY_INNER_ROLE_PREFIXES);
             if (literals != null && !literals.isEmpty()) {
                 setNormalized(literals, innerRolePrefixes);
@@ -157,7 +158,7 @@
         if (roleMatcher == null) {
             roleMatcher = new MultipolygonRoleMatcher();
-            if (Main.pref != null) {
+            if (Config.getPref() != null) {
                 roleMatcher.initFromPreferences();
-                Main.pref.addPreferenceChangeListener(roleMatcher);
+                Config.getPref().addPreferenceChangeListener(roleMatcher);
             }
         }
Index: trunk/src/org/openstreetmap/josm/data/preferences/CachedProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/CachedProperty.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/preferences/CachedProperty.java	(revision 12846)
@@ -2,7 +2,7 @@
 package org.openstreetmap.josm.data.preferences;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -21,5 +21,5 @@
     protected CachedProperty(String key, String defaultValueAsString) {
         super(key, null);
-        Main.pref.addKeyPreferenceChangeListener(key, this);
+        Config.getPref().addKeyPreferenceChangeListener(key, this);
         this.defaultValueAsString = defaultValueAsString;
         updateValue();
@@ -27,6 +27,6 @@
 
     protected final void updateValue() {
-        if (!Main.pref.get(key).isEmpty()) {
-            this.value = fromString(Main.pref.get(key));
+        if (!Config.getPref().get(key).isEmpty()) {
+            this.value = fromString(Config.getPref().get(key));
         } else {
             this.value = getDefaultValue();
@@ -43,5 +43,5 @@
 
     public void put(String value) {
-        Main.pref.put(key, value);
+        Config.getPref().put(key, value);
         this.value = fromString(value);
         updateCount++;
Index: trunk/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java	(revision 12846)
@@ -2,5 +2,5 @@
 package org.openstreetmap.josm.data.preferences;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -23,9 +23,9 @@
 
     public T get(String... params) {
-        return parse(Main.pref.get(getKey(params), defaultValue.name()));
+        return parse(Config.getPref().get(getKey(params), defaultValue.name()));
     }
 
     public boolean put(T value, String... params) {
-        return Main.pref.put(getKey(params), value.name());
+        return Config.getPref().put(getKey(params), value.name());
     }
 
Index: trunk/src/org/openstreetmap/josm/data/preferences/sources/MapPaintPrefHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/sources/MapPaintPrefHelper.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/preferences/sources/MapPaintPrefHelper.java	(revision 12846)
@@ -13,5 +13,5 @@
 import java.util.TreeSet;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -53,5 +53,5 @@
         boolean changed = false;
 
-        Collection<String> knownDefaults = new TreeSet<>(Main.pref.getList("mappaint.style.known-defaults"));
+        Collection<String> knownDefaults = new TreeSet<>(Config.getPref().getList("mappaint.style.known-defaults"));
 
         Collection<ExtendedSourceEntry> defaults = getDefault();
@@ -71,5 +71,5 @@
             knownDefaults.add(def.url);
         }
-        Main.pref.putList("mappaint.style.known-defaults", new ArrayList<>(knownDefaults));
+        Config.getPref().putList("mappaint.style.known-defaults", new ArrayList<>(knownDefaults));
 
         // XML style is not bundled anymore
Index: trunk/src/org/openstreetmap/josm/data/preferences/sources/SourcePrefHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/sources/SourcePrefHelper.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/preferences/sources/SourcePrefHelper.java	(revision 12846)
@@ -10,5 +10,5 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -58,5 +58,5 @@
     public List<SourceEntry> get() {
 
-        List<Map<String, String>> src = Main.pref.getListOfMaps(pref, null);
+        List<Map<String, String>> src = Config.getPref().getListOfMaps(pref, null);
         if (src == null)
             return new ArrayList<>(getDefault());
@@ -79,5 +79,5 @@
     public boolean put(Collection<? extends SourceEntry> entries) {
         List<Map<String, String>> setting = serializeList(entries);
-        boolean unset = Main.pref.getListOfMaps(pref, null) == null;
+        boolean unset = Config.getPref().getListOfMaps(pref, null) == null;
         if (unset) {
             Collection<Map<String, String>> def = serializeList(getDefault());
@@ -85,5 +85,5 @@
                 return false;
         }
-        return Main.pref.putListOfMaps(pref, setting);
+        return Config.getPref().putListOfMaps(pref, setting);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/projection/ProjectionCLI.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/ProjectionCLI.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/projection/ProjectionCLI.java	(revision 12846)
@@ -3,7 +3,4 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
-
-import gnu.getopt.Getopt;
-import gnu.getopt.LongOpt;
 
 import java.io.BufferedReader;
@@ -18,10 +15,12 @@
 import java.util.function.Function;
 
+import org.openstreetmap.josm.CLIModule;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.CLIModule;
 import org.openstreetmap.josm.data.coor.conversion.LatLonParser;
-
 import org.openstreetmap.josm.tools.Utils;
+
+import gnu.getopt.Getopt;
+import gnu.getopt.LongOpt;
 
 /**
Index: trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 12846)
@@ -66,4 +66,5 @@
 import org.openstreetmap.josm.gui.layer.ValidatorLayer;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.Logging;
@@ -282,5 +283,5 @@
 
     private static void applyPrefs(Map<String, Test> tests, boolean beforeUpload) {
-        for (String testName : Main.pref.getList(beforeUpload
+        for (String testName : Config.getPref().getList(beforeUpload
         ? ValidatorPrefHelper.PREF_SKIP_TESTS_BEFORE_UPLOAD : ValidatorPrefHelper.PREF_SKIP_TESTS)) {
             Test test = tests.get(testName);
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/Addresses.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/Addresses.java	(revision 12846)
@@ -15,5 +15,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.Node;
@@ -25,4 +24,5 @@
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Logging;
@@ -205,5 +205,5 @@
         }
         if (centroid == null) return; // fix #8305
-        double maxDistance = Main.pref.getDouble("validator.addresses.max_street_distance", 200.0);
+        double maxDistance = Config.getPref().getDouble("validator.addresses.max_street_distance", 200.0);
         boolean hasIncompleteWays = false;
         for (Way streetPart : street) {
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java	(revision 12846)
@@ -20,5 +20,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.MergeNodesAction;
 import org.openstreetmap.josm.command.Command;
@@ -35,4 +34,5 @@
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.MultiMap;
 
@@ -46,5 +46,5 @@
     private static class NodeHash implements Hash<Object, Object> {
 
-        private final double precision = Main.pref.getDouble("validator.duplicatenodes.precision", 0.);
+        private final double precision = Config.getPref().getDouble("validator.duplicatenodes.precision", 0.);
 
         private LatLon roundCoord(LatLon coor) {
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java	(revision 12846)
@@ -9,5 +9,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
@@ -19,4 +18,5 @@
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -112,5 +112,5 @@
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
-        maxlength = Main.pref.getInt("validator.maximum.segment.length", 15_000);
+        maxlength = Config.getPref().getInt("validator.maximum.segment.length", 15_000);
         reported = new HashSet<>();
         visitedWays = new HashSet<>();
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 12846)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.data.validation.tests;
 
+import static org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.FixCommand.evaluateObject;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -63,4 +64,5 @@
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.UTFInputStreamReader;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -735,5 +737,5 @@
             checks.putAll(url, result.parseChecks);
             // Check assertions, useful for development of local files
-            if (Main.pref.getBoolean("validator.check_assert_local_rules", false) && Utils.isLocalUrl(url)) {
+            if (Config.getPref().getBoolean("validator.check_assert_local_rules", false) && Utils.isLocalUrl(url)) {
                 for (String msg : checkAsserts(result.parseChecks)) {
                     Logging.warn(msg);
@@ -759,5 +761,5 @@
                 }
                 addMapCSS(i);
-                if (Main.pref.getBoolean("validator.auto_reload_local_rules", true) && source.isLocal()) {
+                if (Config.getPref().getBoolean("validator.auto_reload_local_rules", true) && source.isLocal()) {
                     Main.fileWatcher.registerSource(source);
                 }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 12846)
@@ -26,5 +26,4 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.ChangePropertyKeyCommand;
@@ -49,4 +48,5 @@
 import org.openstreetmap.josm.gui.widgets.EditableList;
 import org.openstreetmap.josm.io.CachedFile;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -190,5 +190,5 @@
 
         StringBuilder errorSources = new StringBuilder();
-        for (String source : Main.pref.getList(PREF_SOURCES, DEFAULT_SOURCES)) {
+        for (String source : Config.getPref().getList(PREF_SOURCES, DEFAULT_SOURCES)) {
             try (
                 CachedFile cf = new CachedFile(source);
@@ -282,5 +282,5 @@
     public static void initializePresets() {
 
-        if (!Main.pref.getBoolean(PREF_CHECK_VALUES, true))
+        if (!Config.getPref().getBoolean(PREF_CHECK_VALUES, true))
             return;
 
@@ -292,5 +292,5 @@
             }
             // TODO directionKeys are no longer in OsmPrimitive (search pattern is used instead)
-            for (String a : Main.pref.getList(ValidatorPrefHelper.PREFIX + ".knownkeys",
+            for (String a : Config.getPref().getList(ValidatorPrefHelper.PREFIX + ".knownkeys",
                     Arrays.asList("is_in", "int_ref", "fixme", "population"))) {
                 additionalPresetsValueData.putVoid(a);
@@ -584,22 +584,22 @@
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
-        checkKeys = Main.pref.getBoolean(PREF_CHECK_KEYS, true);
+        checkKeys = Config.getPref().getBoolean(PREF_CHECK_KEYS, true);
         if (isBeforeUpload) {
-            checkKeys = checkKeys && Main.pref.getBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, true);
-        }
-
-        checkValues = Main.pref.getBoolean(PREF_CHECK_VALUES, true);
+            checkKeys = checkKeys && Config.getPref().getBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, true);
+        }
+
+        checkValues = Config.getPref().getBoolean(PREF_CHECK_VALUES, true);
         if (isBeforeUpload) {
-            checkValues = checkValues && Main.pref.getBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, true);
-        }
-
-        checkComplex = Main.pref.getBoolean(PREF_CHECK_COMPLEX, true);
+            checkValues = checkValues && Config.getPref().getBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, true);
+        }
+
+        checkComplex = Config.getPref().getBoolean(PREF_CHECK_COMPLEX, true);
         if (isBeforeUpload) {
-            checkComplex = checkComplex && Main.pref.getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true);
-        }
-
-        checkFixmes = Main.pref.getBoolean(PREF_CHECK_FIXMES, true);
+            checkComplex = checkComplex && Config.getPref().getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true);
+        }
+
+        checkFixmes = Config.getPref().getBoolean(PREF_CHECK_FIXMES, true);
         if (isBeforeUpload) {
-            checkFixmes = checkFixmes && Main.pref.getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true);
+            checkFixmes = checkFixmes && Config.getPref().getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true);
         }
     }
@@ -619,21 +619,21 @@
         testPanel.add(new JLabel(name+" :"), GBC.eol().insets(3, 0, 0, 0));
 
-        prefCheckKeys = new JCheckBox(tr("Check property keys."), Main.pref.getBoolean(PREF_CHECK_KEYS, true));
+        prefCheckKeys = new JCheckBox(tr("Check property keys."), Config.getPref().getBoolean(PREF_CHECK_KEYS, true));
         prefCheckKeys.setToolTipText(tr("Validate that property keys are valid checking against list of words."));
         testPanel.add(prefCheckKeys, GBC.std().insets(20, 0, 0, 0));
 
         prefCheckKeysBeforeUpload = new JCheckBox();
-        prefCheckKeysBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, true));
+        prefCheckKeysBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, true));
         testPanel.add(prefCheckKeysBeforeUpload, a);
 
-        prefCheckComplex = new JCheckBox(tr("Use complex property checker."), Main.pref.getBoolean(PREF_CHECK_COMPLEX, true));
+        prefCheckComplex = new JCheckBox(tr("Use complex property checker."), Config.getPref().getBoolean(PREF_CHECK_COMPLEX, true));
         prefCheckComplex.setToolTipText(tr("Validate property values and tags using complex rules."));
         testPanel.add(prefCheckComplex, GBC.std().insets(20, 0, 0, 0));
 
         prefCheckComplexBeforeUpload = new JCheckBox();
-        prefCheckComplexBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true));
+        prefCheckComplexBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, true));
         testPanel.add(prefCheckComplexBeforeUpload, a);
 
-        final Collection<String> sources = Main.pref.getList(PREF_SOURCES, DEFAULT_SOURCES);
+        final Collection<String> sources = Config.getPref().getList(PREF_SOURCES, DEFAULT_SOURCES);
         sourcesList = new EditableList(tr("TagChecker source"));
         sourcesList.setItems(sources);
@@ -649,18 +649,18 @@
         handlePrefEnable();
 
-        prefCheckValues = new JCheckBox(tr("Check property values."), Main.pref.getBoolean(PREF_CHECK_VALUES, true));
+        prefCheckValues = new JCheckBox(tr("Check property values."), Config.getPref().getBoolean(PREF_CHECK_VALUES, true));
         prefCheckValues.setToolTipText(tr("Validate that property values are valid checking against presets."));
         testPanel.add(prefCheckValues, GBC.std().insets(20, 0, 0, 0));
 
         prefCheckValuesBeforeUpload = new JCheckBox();
-        prefCheckValuesBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, true));
+        prefCheckValuesBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, true));
         testPanel.add(prefCheckValuesBeforeUpload, a);
 
-        prefCheckFixmes = new JCheckBox(tr("Check for FIXMES."), Main.pref.getBoolean(PREF_CHECK_FIXMES, true));
+        prefCheckFixmes = new JCheckBox(tr("Check for FIXMES."), Config.getPref().getBoolean(PREF_CHECK_FIXMES, true));
         prefCheckFixmes.setToolTipText(tr("Looks for nodes or ways with FIXME in any property value."));
         testPanel.add(prefCheckFixmes, GBC.std().insets(20, 0, 0, 0));
 
         prefCheckFixmesBeforeUpload = new JCheckBox();
-        prefCheckFixmesBeforeUpload.setSelected(Main.pref.getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true));
+        prefCheckFixmesBeforeUpload.setSelected(Config.getPref().getBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, true));
         testPanel.add(prefCheckFixmesBeforeUpload, a);
     }
@@ -681,13 +681,13 @@
                 || prefCheckFixmesBeforeUpload.isSelected() || prefCheckComplexBeforeUpload.isSelected();
 
-        Main.pref.putBoolean(PREF_CHECK_VALUES, prefCheckValues.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_COMPLEX, prefCheckComplex.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_KEYS, prefCheckKeys.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_FIXMES, prefCheckFixmes.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, prefCheckValuesBeforeUpload.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, prefCheckComplexBeforeUpload.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, prefCheckKeysBeforeUpload.isSelected());
-        Main.pref.putBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, prefCheckFixmesBeforeUpload.isSelected());
-        return Main.pref.putList(PREF_SOURCES, sourcesList.getItems());
+        Config.getPref().putBoolean(PREF_CHECK_VALUES, prefCheckValues.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_COMPLEX, prefCheckComplex.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_KEYS, prefCheckKeys.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_FIXMES, prefCheckFixmes.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_VALUES_BEFORE_UPLOAD, prefCheckValuesBeforeUpload.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_COMPLEX_BEFORE_UPLOAD, prefCheckComplexBeforeUpload.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_KEYS_BEFORE_UPLOAD, prefCheckKeysBeforeUpload.isSelected());
+        Config.getPref().putBoolean(PREF_CHECK_FIXMES_BEFORE_UPLOAD, prefCheckFixmesBeforeUpload.isSelected());
+        return Config.getPref().putList(PREF_SOURCES, sourcesList.getItems());
     }
 
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 12846)
@@ -33,4 +33,5 @@
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -166,6 +167,6 @@
         middlenodes = new QuadBuckets<>();
         othernodes = new HashSet<>();
-        mindist = Main.pref.getDouble(PREFIX + ".node_way_distance", 10.0);
-        minmiddledist = Main.pref.getDouble(PREFIX + ".way_way_distance", 0.0);
+        mindist = Config.getPref().getDouble(PREFIX + ".node_way_distance", 10.0);
+        minmiddledist = Config.getPref().getDouble(PREFIX + ".way_way_distance", 0.0);
         DataSet dataSet = Main.main != null ? Main.main.getEditDataSet() : null;
         dsArea = dataSet == null ? null : dataSet.getDataSourceArea();
Index: trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java	(revision 12846)
@@ -17,6 +17,6 @@
 import javax.swing.JRadioButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Utils;
@@ -57,8 +57,7 @@
      */
     public static int getDialogReturnValue(String prefKey) {
-        return Utils.firstNonNull(
-                immediateChoices.get(prefKey),
+        return Utils.firstNonNull(immediateChoices.get(prefKey),
                 sessionChoices.get(prefKey),
-                !Main.pref.getBoolean("message." + prefKey, true) ? Main.pref.getInt("message." + prefKey + ".value", -1) : -1
+                !Config.getPref().getBoolean("message." + prefKey, true) ? Config.getPref().getInt("message." + prefKey + ".value", -1) : -1
         );
     }
@@ -239,6 +238,6 @@
                     break;
                 case PERMANENT:
-                    Main.pref.putBoolean("message." + prefKey, false);
-                    Main.pref.putInt("message." + prefKey + ".value", value);
+                    Config.getPref().putBoolean("message." + prefKey, false);
+                    Config.getPref().putInt("message." + prefKey + ".value", value);
                     break;
             }
Index: trunk/src/org/openstreetmap/josm/gui/GettingStarted.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 12846)
@@ -29,4 +29,5 @@
 import org.openstreetmap.josm.io.CacheCustomContent;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.LanguageInfo;
 import org.openstreetmap.josm.tools.Logging;
@@ -95,7 +96,7 @@
             String motd = new WikiReader().readLang("StartupPage");
             // Save this to prefs in case JOSM is updated so MOTD can be refreshed
-            Main.pref.putInt("cache.motd.html.version", myVersion);
-            Main.pref.put("cache.motd.html.java", myJava);
-            Main.pref.put("cache.motd.html.lang", myLang);
+            Config.getPref().putInt("cache.motd.html.version", myVersion);
+            Config.getPref().put("cache.motd.html.java", myJava);
+            Config.getPref().put("cache.motd.html.lang", myLang);
             return motd.getBytes(StandardCharsets.UTF_8);
         }
@@ -115,7 +116,7 @@
             // 2. Cannot be written (e.g. while developing). Obviously we don't want to update
             // everytime because of something we can't read.
-            return (Main.pref.getInt("cache.motd.html.version", -999) == myVersion)
-            && Main.pref.get("cache.motd.html.java").equals(myJava)
-            && Main.pref.get("cache.motd.html.lang").equals(myLang);
+            return (Config.getPref().getInt("cache.motd.html.version", -999) == myVersion)
+            && Config.getPref().get("cache.motd.html.java").equals(myJava)
+            && Config.getPref().get("cache.motd.html.lang").equals(myLang);
         }
     }
@@ -146,5 +147,5 @@
         // Asynchronously get MOTD to speed-up JOSM startup
         Thread t = new Thread((Runnable) () -> {
-            if (!contentInitialized && Main.pref.getBoolean("help.displaymotd", true)) {
+            if (!contentInitialized && Config.getPref().getBoolean("help.displaymotd", true)) {
                 try {
                     content = new MotdContent().updateIfRequiredString();
Index: trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 12846)
@@ -10,7 +10,7 @@
 import javax.swing.JToggleButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Destroyable;
@@ -93,10 +93,10 @@
     @Override
     public void applyButtonHiddenPreferences() {
-        boolean alwaysHideDisabled = Main.pref.getBoolean("sidetoolbar.hideDisabledButtons", false);
+        boolean alwaysHideDisabled = Config.getPref().getBoolean("sidetoolbar.hideDisabledButtons", false);
         if (!isEnabled() && (hideIfDisabled || alwaysHideDisabled)) {
             setVisible(false);  // hide because of disabled button
         } else {
             boolean hiddenFlag = false;
-            String hiddenFlagStr = Main.pref.get(getPreferenceKey(), null);
+            String hiddenFlagStr = Config.getPref().get(getPreferenceKey(), null);
             if (hiddenFlagStr == null) {
                 if (isExpert && !ExpertToggleAction.isExpert()) {
@@ -118,7 +118,7 @@
         if ((b && isExpert && !ExpertToggleAction.isExpert()) ||
             (!b && isExpert && ExpertToggleAction.isExpert())) {
-            Main.pref.put(getPreferenceKey(), null);
+            Config.getPref().put(getPreferenceKey(), null);
         } else {
-            Main.pref.putBoolean(getPreferenceKey(), b);
+            Config.getPref().putBoolean(getPreferenceKey(), b);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/MainFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainFrame.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/MainFrame.java	(revision 12846)
@@ -20,5 +20,4 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
@@ -28,4 +27,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.LayerStateChangeListener;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -110,5 +110,5 @@
             geometry.remember("gui.geometry");
         }
-        Main.pref.putBoolean("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0);
+        Config.getPref().putBoolean("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 12846)
@@ -122,4 +122,5 @@
 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSearchPrimitiveDialog;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -799,9 +800,9 @@
         changesetManager.addButtonModel(mi.getModel());
 
-        if (!Main.pref.getBoolean("audio.menuinvisible", false)) {
+        if (!Config.getPref().getBoolean("audio.menuinvisible", false)) {
             showAudioMenu(true);
         }
 
-        Main.pref.addPreferenceChangeListener(e -> {
+        Config.getPref().addPreferenceChangeListener(e -> {
             if ("audio.menuinvisible".equals(e.getKey())) {
                 showAudioMenu(!Boolean.parseBoolean(e.getNewValue().toString()));
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 12846)
@@ -42,5 +42,4 @@
 import javax.swing.plaf.basic.BasicSplitPaneUI;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.LassoModeAction;
 import org.openstreetmap.josm.actions.mapmode.DeleteAction;
@@ -80,4 +79,5 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.AdvancedKeyPressDetector;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
@@ -295,5 +295,5 @@
         }
 
-        if (Main.pref.getBoolean("debug.advanced-keypress-detector.enable", true)) {
+        if (Config.getPref().getBoolean("debug.advanced-keypress-detector.enable", true)) {
             keyDetector.register();
         }
@@ -345,5 +345,5 @@
         MainApplication.getLayerManager().removeActiveLayerChangeListener(this);
         dialogsPanel.destroy();
-        Main.pref.removePreferenceChangeListener(sidetoolbarPreferencesChangedListener);
+        Config.getPref().removePreferenceChangeListener(sidetoolbarPreferencesChangedListener);
         for (int i = 0; i < toolBarActions.getComponentCount(); ++i) {
             if (toolBarActions.getComponent(i) instanceof Destroyable) {
@@ -496,5 +496,5 @@
          * sideToolBar: add map modes icons
          */
-        if (Main.pref.getBoolean("sidetoolbar.mapmodes.visible", true)) {
+        if (Config.getPref().getBoolean("sidetoolbar.mapmodes.visible", true)) {
             toolBarActions.setAlignmentX(0.5f);
             toolBarActions.setBorder(null);
@@ -511,5 +511,5 @@
          * sideToolBar: add toggle dialogs icons
          */
-        if (Main.pref.getBoolean("sidetoolbar.toggledialogs.visible", true)) {
+        if (Config.getPref().getBoolean("sidetoolbar.toggledialogs.visible", true)) {
             ((JToolBar) sideToolBar).addSeparator(new Dimension(0, 18));
             toolBarToggle.setAlignmentX(0.5f);
@@ -534,15 +534,15 @@
          * sideToolBar: decide scroll- and visibility
          */
-        if (Main.pref.getBoolean("sidetoolbar.scrollable", true)) {
+        if (Config.getPref().getBoolean("sidetoolbar.scrollable", true)) {
             final ScrollViewport svp = new ScrollViewport(sideToolBar, ScrollViewport.VERTICAL_DIRECTION);
             sideToolBar = svp;
         }
-        sideToolBar.setVisible(Main.pref.getBoolean("sidetoolbar.visible", true));
+        sideToolBar.setVisible(Config.getPref().getBoolean("sidetoolbar.visible", true));
         sidetoolbarPreferencesChangedListener = e -> {
             if ("sidetoolbar.visible".equals(e.getKey())) {
-                sideToolBar.setVisible(Main.pref.getBoolean("sidetoolbar.visible"));
+                sideToolBar.setVisible(Config.getPref().getBoolean("sidetoolbar.visible"));
             }
         };
-        Main.pref.addPreferenceChangeListener(sidetoolbarPreferencesChangedListener);
+        Config.getPref().addPreferenceChangeListener(sidetoolbarPreferencesChangedListener);
 
         /**
@@ -554,5 +554,5 @@
          * statusLine: add to panel
          */
-        if (statusLine != null && Main.pref.getBoolean("statusline.visible", true)) {
+        if (statusLine != null && Config.getPref().getBoolean("statusline.visible", true)) {
             panel.add(statusLine, BorderLayout.SOUTH);
         }
@@ -583,5 +583,5 @@
             public void actionPerformed(ActionEvent e) {
                 boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
-                Main.pref.putBoolean("sidetoolbar.always-visible", sel);
+                Config.getPref().putBoolean("sidetoolbar.always-visible", sel);
             }
         });
@@ -606,5 +606,5 @@
                         }, 0);
                     }
-                    doNotHide.setSelected(Main.pref.getBoolean("sidetoolbar.always-visible", true));
+                    doNotHide.setSelected(Config.getPref().getBoolean("sidetoolbar.always-visible", true));
                 }
 
@@ -625,5 +625,5 @@
                 @Override
                 public void actionPerformed(ActionEvent e) {
-                    Main.pref.putBoolean("sidetoolbar.visible", false);
+                    Config.getPref().putBoolean("sidetoolbar.visible", false);
                 }
             });
Index: trunk/src/org/openstreetmap/josm/gui/MapMover.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapMover.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/MapMover.java	(revision 12846)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.Pair;
@@ -48,5 +49,5 @@
 
         JMapViewerUpdater() {
-            Main.pref.addPreferenceChangeListener(this);
+            Config.getPref().addPreferenceChangeListener(this);
             updateJMapViewer();
         }
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 12846)
@@ -79,4 +79,5 @@
 import org.openstreetmap.josm.gui.widgets.ImageLabel;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
@@ -100,5 +101,5 @@
 public final class MapStatus extends JPanel implements Helpful, Destroyable, PreferenceChangedListener, SoMChangeListener {
 
-    private final DecimalFormat DECIMAL_FORMAT = new DecimalFormat(Main.pref.get("statusbar.decimal-format", "0.0"));
+    private final DecimalFormat DECIMAL_FORMAT = new DecimalFormat(Config.getPref().get("statusbar.decimal-format", "0.0"));
     private static final AbstractProperty<Double> DISTANCE_THRESHOLD = new DoubleProperty("statusbar.distance-threshold", 0.01).cached();
 
@@ -775,5 +776,5 @@
             public void actionPerformed(ActionEvent e) {
                 boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
-                Main.pref.putBoolean("statusbar.always-visible", sel);
+                Config.getPref().putBoolean("statusbar.always-visible", sel);
             }
         });
@@ -820,5 +821,5 @@
                     }
                     separator.setVisible(distText.equals(invoker) || latText.equals(invoker) || lonText.equals(invoker));
-                    doNotHide.setSelected(Main.pref.getBoolean("statusbar.always-visible", true));
+                    doNotHide.setSelected(Config.getPref().getBoolean("statusbar.always-visible", true));
                 }
 
@@ -914,5 +915,5 @@
         add(distText, GBC.std().insets(3, 0, 0, 0));
 
-        if (Main.pref.getBoolean("statusbar.change-system-of-measurement-on-click", true)) {
+        if (Config.getPref().getBoolean("statusbar.change-system-of-measurement-on-click", true)) {
             distText.addMouseListener(new MouseAdapter() {
                 private final List<String> soms = new ArrayList<>(new TreeSet<>(SystemOfMeasurement.ALL_SYSTEMS.keySet()));
@@ -945,5 +946,5 @@
         progressBar.addMouseListener(new ShowMonitorDialogMouseAdapter());
 
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
 
         mvComponentAdapter = new ComponentAdapter() {
@@ -974,5 +975,5 @@
     public void updateSystemOfMeasurement(String newsom) {
         SystemOfMeasurement.setSystemOfMeasurement(newsom);
-        if (Main.pref.getBoolean("statusbar.notify.change-system-of-measurement", true)) {
+        if (Config.getPref().getBoolean("statusbar.notify.change-system-of-measurement", true)) {
             new Notification(tr("System of measurement changed to {0}", newsom))
                 .setDuration(Notification.TIME_SHORT)
@@ -1079,5 +1080,5 @@
         // Compute total length of selected way(s) until an arbitrary limit set to 250 ways
         // in order to prevent performance issue if a large number of ways are selected (old behaviour kept in that case, see #8403)
-        int maxWays = Math.max(1, Main.pref.getInt("selection.max-ways-for-statusline", 250));
+        int maxWays = Math.max(1, Config.getPref().getInt("selection.max-ways-for-statusline", 250));
         if (!ways.isEmpty() && ways.size() <= maxWays) {
             dist = 0.0;
@@ -1106,5 +1107,5 @@
     public void destroy() {
         SystemOfMeasurement.removeSoMChangeListener(this);
-        Main.pref.removePreferenceChangeListener(this);
+        Config.getPref().removePreferenceChangeListener(this);
         mv.removeComponentListener(mvComponentAdapter);
 
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 12846)
@@ -76,4 +76,5 @@
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
 import org.openstreetmap.josm.io.audio.AudioPlayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.Logging;
@@ -277,5 +278,5 @@
         layerManager.addAndFireLayerChangeListener(this);
         layerManager.addActiveLayerChangeListener(this);
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
 
         addComponentListener(new ComponentAdapter() {
@@ -813,5 +814,5 @@
         layerManager.removeAndFireLayerChangeListener(this);
         layerManager.removeActiveLayerChangeListener(this);
-        Main.pref.removePreferenceChangeListener(this);
+        Config.getPref().removePreferenceChangeListener(this);
         SelectionEventManager.getInstance().removeSelectionListener(repaintSelectionChangedListener);
         MultipolygonCache.getInstance().clear();
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 12846)
@@ -60,4 +60,5 @@
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.util.CursorManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -869,7 +870,7 @@
     private void pushZoomUndo(EastNorth center, double scale) {
         Date now = new Date();
-        if ((now.getTime() - zoomTimestamp.getTime()) > (Main.pref.getDouble("zoom.undo.delay", 1.0) * 1000)) {
+        if ((now.getTime() - zoomTimestamp.getTime()) > (Config.getPref().getDouble("zoom.undo.delay", 1.0) * 1000)) {
             zoomUndoBuffer.push(new ZoomData(center, scale));
-            if (zoomUndoBuffer.size() > Main.pref.getInt("zoom.undo.max", 50)) {
+            if (zoomUndoBuffer.size() > Config.getPref().getInt("zoom.undo.max", 50)) {
                 zoomUndoBuffer.remove(0);
             }
@@ -1144,8 +1145,8 @@
 
         if (ds != null) {
-            double snapDistanceSq = Main.pref.getInt("mappaint.segment.snap-distance", 10);
+            double snapDistanceSq = Config.getPref().getInt("mappaint.segment.snap-distance", 10);
             snapDistanceSq *= snapDistanceSq;
 
-            for (Way w : ds.searchWays(getBBox(p, Main.pref.getInt("mappaint.segment.snap-distance", 10)))) {
+            for (Way w : ds.searchWays(getBBox(p, Config.getPref().getInt("mappaint.segment.snap-distance", 10)))) {
                 if (!predicate.test(w)) {
                     continue;
Index: trunk/src/org/openstreetmap/josm/gui/Notification.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/Notification.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/Notification.java	(revision 12846)
@@ -10,6 +10,6 @@
 import javax.swing.UIManager;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -43,15 +43,15 @@
      * E.g. "Please select at least one node".
      */
-    public static final int TIME_SHORT = Main.pref.getInt("notification-time-short-ms", 3000);
+    public static final int TIME_SHORT = Config.getPref().getInt("notification-time-short-ms", 3000);
 
     /**
      * Short message of one or two lines (5 s).
      */
-    public static final int TIME_DEFAULT = Main.pref.getInt("notification-time-default-ms", 5000);
+    public static final int TIME_DEFAULT = Config.getPref().getInt("notification-time-default-ms", 5000);
 
     /**
      * Somewhat longer message (10 s).
      */
-    public static final int TIME_LONG = Main.pref.getInt("notification-time-long-ms", 10_000);
+    public static final int TIME_LONG = Config.getPref().getInt("notification-time-long-ms", 10_000);
 
     /**
@@ -59,5 +59,5 @@
      * (Make sure is still sensible to show as a notification)
      */
-    public static final int TIME_VERY_LONG = Main.pref.getInt("notification-time-very_long-ms", 20_000);
+    public static final int TIME_VERY_LONG = Config.getPref().getInt("notification-time-very_long-ms", 20_000);
 
     private Component content;
Index: trunk/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java	(revision 12846)
@@ -20,8 +20,8 @@
 import javax.swing.UIManager;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor.ProgressMonitorDialog;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -82,5 +82,5 @@
                 int w = getWidth();
                 if (w > 200) {
-                    Main.pref.putInt("progressdialog.size", w);
+                    Config.getPref().putInt("progressdialog.size", w);
                 }
             }
@@ -98,5 +98,5 @@
         setDropTarget(null); // Workaround to JDK bug 7027598/7100524/7169912 (#8613)
         pack();
-        setSize(Main.pref.getInt("progressdialog.size", 600), getSize().height);
+        setSize(Config.getPref().getInt("progressdialog.size", 600), getSize().height);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java	(revision 12846)
@@ -11,6 +11,6 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
+import org.openstreetmap.josm.gui.progress.ProgressTaskId;
 import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
-import org.openstreetmap.josm.gui.progress.ProgressTaskId;
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
Index: trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java	(revision 12846)
@@ -21,5 +21,4 @@
 import java.util.regex.Pattern;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
@@ -56,4 +55,5 @@
 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
 import org.openstreetmap.josm.gui.widgets.OSDLabel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -124,5 +124,5 @@
     private AutoFilterManager() {
         MapFrame.addMapModeChangeListener(this);
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
         NavigatableComponent.addZoomChangeListener(this);
         MainApplication.getLayerManager().addLayerChangeListener(this);
Index: trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 12846)
@@ -44,4 +44,5 @@
 import org.openstreetmap.josm.gui.layer.AbstractCachedTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.TMSLayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -151,5 +152,5 @@
         uncachedLoader = new OsmTileLoader(this);
         uncachedLoader.headers.putAll(headers);
-        setZoomContolsVisible(Main.pref.getBoolean("slippy_map_chooser.zoomcontrols", false));
+        setZoomContolsVisible(Config.getPref().getBoolean("slippy_map_chooser.zoomcontrols", false));
         setMapMarkerVisible(false);
         setMinimumSize(new Dimension(350, 350 / 2));
@@ -160,7 +161,7 @@
             setFileCacheEnabled(false);
         } else {
-            setFileCacheEnabled(Main.pref.getBoolean("slippy_map_chooser.file_cache", true));
-        }
-        setMaxTilesInMemory(Main.pref.getInt("slippy_map_chooser.max_tiles", 1000));
+            setFileCacheEnabled(Config.getPref().getBoolean("slippy_map_chooser.file_cache", true));
+        }
+        setMaxTilesInMemory(Config.getPref().getInt("slippy_map_chooser.max_tiles", 1000));
 
         List<TileSource> tileSources = getAllTileSources();
Index: trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java	(revision 12846)
@@ -14,5 +14,5 @@
 import javax.swing.JScrollPane;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -60,12 +60,10 @@
                 cbShowTagsWithMultiValuesOnly.setEnabled(cbShowTagsWithConflictsOnly.isSelected());
         });
-        cbShowTagsWithConflictsOnly.setSelected(
-                Main.pref.getBoolean(getClass().getName() + ".showTagsWithConflictsOnly", false)
+        cbShowTagsWithConflictsOnly.setSelected(Config.getPref().getBoolean(getClass().getName() + ".showTagsWithConflictsOnly", false)
         );
         cbShowTagsWithMultiValuesOnly.addChangeListener(
                 e -> model.setShowTagsWithMultiValuesOnly(cbShowTagsWithMultiValuesOnly.isSelected())
         );
-        cbShowTagsWithMultiValuesOnly.setSelected(
-                Main.pref.getBoolean(getClass().getName() + ".showTagsWithMultiValuesOnly", false)
+        cbShowTagsWithMultiValuesOnly.setSelected(Config.getPref().getBoolean(getClass().getName() + ".showTagsWithMultiValuesOnly", false)
         );
         cbShowTagsWithMultiValuesOnly.setEnabled(cbShowTagsWithConflictsOnly.isSelected());
@@ -78,6 +76,6 @@
      */
     public void rememberPreferences() {
-        Main.pref.putBoolean(getClass().getName() + ".showTagsWithConflictsOnly", cbShowTagsWithConflictsOnly.isSelected());
-        Main.pref.putBoolean(getClass().getName() + ".showTagsWithMultiValuesOnly", cbShowTagsWithMultiValuesOnly.isSelected());
+        Config.getPref().putBoolean(getClass().getName() + ".showTagsWithConflictsOnly", cbShowTagsWithConflictsOnly.isSelected());
+        Config.getPref().putBoolean(getClass().getName() + ".showTagsWithMultiValuesOnly", cbShowTagsWithMultiValuesOnly.isSelected());
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 12846)
@@ -58,4 +58,5 @@
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -165,5 +166,5 @@
         cbInSelectionOnly.setToolTipText(tr("<html>Select to show changesets for the currently selected objects only.<br>"
                 + "Unselect to show all changesets for objects in the current data layer.</html>"));
-        cbInSelectionOnly.setSelected(Main.pref.getBoolean("changeset-dialog.for-selected-objects-only", false));
+        cbInSelectionOnly.setSelected(Config.getPref().getBoolean("changeset-dialog.for-selected-objects-only", false));
         return pnl;
     }
@@ -275,5 +276,5 @@
         @Override
         public void itemStateChanged(ItemEvent e) {
-            Main.pref.putBoolean("changeset-dialog.for-selected-objects-only", cbInSelectionOnly.isSelected());
+            Config.getPref().putBoolean("changeset-dialog.for-selected-objects-only", cbInSelectionOnly.isSelected());
             pnlList.removeAll();
             if (cbInSelectionOnly.isSelected()) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 12846)
@@ -43,7 +43,7 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapFrame.MapModeChangeListener;
+import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.util.MultikeyActionsHandler;
 import org.openstreetmap.josm.gui.util.MultikeyShortcutAction;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 12846)
@@ -66,11 +66,12 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
+import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
 import org.openstreetmap.josm.gui.util.MultikeyActionsHandler;
 import org.openstreetmap.josm.gui.util.MultikeyShortcutAction.MultikeyInfo;
-import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.gui.widgets.ScrollableTable;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -538,5 +539,5 @@
                 label.setFont(label.getFont().deriveFont(Font.BOLD));
             }
-            if (Main.pref.getBoolean("dialog.layer.colorname", true)) {
+            if (Config.getPref().getBoolean("dialog.layer.colorname", true)) {
                 AbstractProperty<Color> prop = layer.getColorProperty();
                 Color c = prop == null ? null : prop.get();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 12846)
@@ -64,9 +64,9 @@
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
 import org.openstreetmap.josm.gui.mappaint.StyleSetting;
+import org.openstreetmap.josm.gui.mappaint.StyleSettingGuiFactory;
 import org.openstreetmap.josm.gui.mappaint.StyleSource;
 import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
-import org.openstreetmap.josm.gui.mappaint.StyleSettingGuiFactory;
 import org.openstreetmap.josm.gui.util.FileFilterAllFiles;
 import org.openstreetmap.josm.gui.util.GuiHelper;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java	(revision 12846)
@@ -27,5 +27,4 @@
 import javax.swing.plaf.basic.BasicComboBoxEditor;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
@@ -38,4 +37,5 @@
 import org.openstreetmap.josm.gui.widgets.OsmIdTextField;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitiveTypesComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -180,5 +180,5 @@
     protected void restorePrimitivesHistory(HistoryComboBox cbHistory) {
         List<String> cmtHistory = new LinkedList<>(
-                Main.pref.getList(getClass().getName() + ".primitivesHistory", new LinkedList<String>()));
+                Config.getPref().getList(getClass().getName() + ".primitivesHistory", new LinkedList<String>()));
         // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         Collections.reverse(cmtHistory);
@@ -193,5 +193,5 @@
     protected void remindPrimitivesHistory(HistoryComboBox cbHistory) {
         cbHistory.addCurrentItemToHistory();
-        Main.pref.putList(getClass().getName() + ".primitivesHistory", cbHistory.getHistory());
+        Config.getPref().putList(getClass().getName() + ".primitivesHistory", cbHistory.getHistory());
     }
 
@@ -208,7 +208,7 @@
     public void setupDialog() {
         setContent(panel, false);
-        cbType.setSelectedIndex(Main.pref.getInt("downloadprimitive.lasttype", 0));
+        cbType.setSelectedIndex(Config.getPref().getInt("downloadprimitive.lasttype", 0));
         tfId.setType(cbType.getType());
-        if (Main.pref.getBoolean("downloadprimitive.autopaste", true)) {
+        if (Config.getPref().getBoolean("downloadprimitive.autopaste", true)) {
             tryToPasteFromClipboard(tfId, cbType);
         }
@@ -221,5 +221,5 @@
         String buf = ClipboardUtils.getClipboardStringContent();
         if (buf == null || buf.isEmpty()) return;
-        if (buf.length() > Main.pref.getInt("downloadprimitive.max-autopaste-length", 2000)) return;
+        if (buf.length() > Config.getPref().getInt("downloadprimitive.max-autopaste-length", 2000)) return;
         final List<SimplePrimitiveId> ids = SimplePrimitiveId.fuzzyParse(buf);
         if (!ids.isEmpty()) {
@@ -244,5 +244,5 @@
     @Override public void windowClosed(WindowEvent e) {
         if (e != null && e.getComponent() == this && getValue() == getContinueButtonIndex()) {
-            Main.pref.putInt("downloadprimitive.lasttype", cbType.getSelectedIndex());
+            Config.getPref().putInt("downloadprimitive.lasttype", cbType.getSelectedIndex());
 
             if (!tfId.readIds()) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 12846)
@@ -77,4 +77,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -122,5 +123,5 @@
 
     private final transient HighlightHelper highlightHelper = new HighlightHelper();
-    private final boolean highlightEnabled = Main.pref.getBoolean("draw.target-highlight", true);
+    private final boolean highlightEnabled = Config.getPref().getBoolean("draw.target-highlight", true);
     private final transient RecentRelationsAction recentRelationsAction;
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 12846)
@@ -38,5 +38,4 @@
 import javax.swing.event.ListSelectionListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AbstractSelectAction;
 import org.openstreetmap.josm.actions.AutoScaleAction;
@@ -58,5 +57,4 @@
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
-import org.openstreetmap.josm.data.osm.search.SearchSetting;
 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
 import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
@@ -66,4 +64,5 @@
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.data.osm.search.SearchSetting;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -82,4 +81,5 @@
 import org.openstreetmap.josm.gui.widgets.ListPopupMenu;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -192,5 +192,5 @@
     class MouseEventHandler extends PopupMenuLauncher {
         private final HighlightHelper helper = new HighlightHelper();
-        private final boolean highlightEnabled = Main.pref.getBoolean("draw.target-highlight", true);
+        private final boolean highlightEnabled = Config.getPref().getBoolean("draw.target-highlight", true);
 
         MouseEventHandler() {
@@ -524,5 +524,5 @@
                 }
             }
-            int maxsize = Main.pref.getInt("select.history-size", SELECTION_HISTORY_SIZE);
+            int maxsize = Config.getPref().getInt("select.history-size", SELECTION_HISTORY_SIZE);
             while (history.size() > maxsize) {
                 history.removeLast();
@@ -662,7 +662,7 @@
          */
         public synchronized void sort() {
-            if (selection.size() <= Main.pref.getInt("selection.no_sort_above", 100_000)) {
-                boolean quick = selection.size() > Main.pref.getInt("selection.fast_sort_above", 10_000);
-                Comparator<OsmPrimitive> c = Main.pref.getBoolean("selection.sort_relations_before_ways", true)
+            if (selection.size() <= Config.getPref().getInt("selection.no_sort_above", 100_000)) {
+                boolean quick = selection.size() > Config.getPref().getInt("selection.fast_sort_above", 10_000);
+                Comparator<OsmPrimitive> c = Config.getPref().getBoolean("selection.sort_relations_before_ways", true)
                         ? OsmPrimitiveComparator.orderingRelationsWaysNodes()
                         : OsmPrimitiveComparator.orderingWaysRelationsNodes();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 12846)
@@ -69,4 +69,5 @@
 import org.openstreetmap.josm.gui.util.WindowGeometry.WindowGeometryException;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
@@ -245,7 +246,7 @@
         toggleAction.putValue("help", helpId.substring(0, helpId.length()-6));
 
-        isShowing = Main.pref.getBoolean(preferencePrefix+".visible", defShow);
-        isDocked = Main.pref.getBoolean(preferencePrefix+".docked", true);
-        isCollapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
+        isShowing = Config.getPref().getBoolean(preferencePrefix+".visible", defShow);
+        isDocked = Config.getPref().getBoolean(preferencePrefix+".docked", true);
+        isCollapsed = Config.getPref().getBoolean(preferencePrefix+".minimized", false);
         buttonHiding = propButtonHiding.get();
 
@@ -257,5 +258,5 @@
 
         MainApplication.redirectToMainContentPane(this);
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
 
         registerInWindowMenu();
@@ -468,5 +469,5 @@
         }
         Toolkit.getDefaultToolkit().removeAWTEventListener(this);
-        Main.pref.removePreferenceChangeListener(this);
+        Config.getPref().removePreferenceChangeListener(this);
         destroyComponents(this, false);
     }
@@ -773,5 +774,5 @@
     protected void setIsShowing(boolean val) {
         isShowing = val;
-        Main.pref.putBoolean(preferencePrefix+".visible", val);
+        Config.getPref().putBoolean(preferencePrefix+".visible", val);
         stateChanged();
     }
@@ -782,5 +783,5 @@
         }
         isDocked = val;
-        Main.pref.putBoolean(preferencePrefix+".docked", val);
+        Config.getPref().putBoolean(preferencePrefix+".docked", val);
         stateChanged();
     }
@@ -788,5 +789,5 @@
     protected void setIsCollapsed(boolean val) {
         isCollapsed = val;
-        Main.pref.putBoolean(preferencePrefix+".minimized", val);
+        Config.getPref().putBoolean(preferencePrefix+".minimized", val);
         stateChanged();
     }
@@ -925,5 +926,5 @@
                     continue;
                 }
-                final JPanel buttonRowPanel = new JPanel(Main.pref.getBoolean("dialog.align.left", false)
+                final JPanel buttonRowPanel = new JPanel(Config.getPref().getBoolean("dialog.align.left", false)
                         ? new FlowLayout(FlowLayout.LEFT) : new GridLayout(1, buttonRow.size()));
                 buttonsPanel.add(buttonRowPanel);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 12846)
@@ -58,4 +58,5 @@
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -493,5 +494,5 @@
                     ds.setSelected(sel);
                 }
-                if (Main.pref.getBoolean("validator.autozoom", false)) {
+                if (Config.getPref().getBoolean("validator.autozoom", false)) {
                     AutoScaleAction.zoomTo(sel);
                 }
@@ -573,5 +574,5 @@
      */
     public void updateSelection(Collection<? extends OsmPrimitive> newSelection) {
-        if (!Main.pref.getBoolean(ValidatorPrefHelper.PREF_FILTER_BY_SELECTION, false))
+        if (!Config.getPref().getBoolean(ValidatorPrefHelper.PREF_FILTER_BY_SELECTION, false))
             return;
         if (newSelection.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java	(revision 12846)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -60,5 +61,5 @@
         add(btn);
 
-        if (Main.pref.getBoolean("downloadchangeset.autopaste", true)) {
+        if (Config.getPref().getBoolean("downloadchangeset.autopaste", true)) {
             tfChangesetId.tryToPasteFromClipboard();
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java	(revision 12846)
@@ -15,9 +15,9 @@
 import javax.swing.JScrollPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.io.ChangesetQuery;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -209,8 +209,8 @@
      */
     public void rememberSettings() {
-        Main.pref.putBoolean("changeset-query.advanced.user-restrictions", cbUserRestriction.isSelected());
-        Main.pref.putBoolean("changeset-query.advanced.open-restrictions", cbOpenAndCloseRestrictions.isSelected());
-        Main.pref.putBoolean("changeset-query.advanced.time-restrictions", cbTimeRestrictions.isSelected());
-        Main.pref.putBoolean("changeset-query.advanced.bbox-restrictions", cbBoundingBoxRestriction.isSelected());
+        Config.getPref().putBoolean("changeset-query.advanced.user-restrictions", cbUserRestriction.isSelected());
+        Config.getPref().putBoolean("changeset-query.advanced.open-restrictions", cbOpenAndCloseRestrictions.isSelected());
+        Config.getPref().putBoolean("changeset-query.advanced.time-restrictions", cbTimeRestrictions.isSelected());
+        Config.getPref().putBoolean("changeset-query.advanced.bbox-restrictions", cbBoundingBoxRestriction.isSelected());
 
         pnlUserRestriction.rememberSettings();
@@ -223,8 +223,8 @@
      */
     public void restoreFromSettings() {
-        cbUserRestriction.setSelected(Main.pref.getBoolean("changeset-query.advanced.user-restrictions", false));
-        cbOpenAndCloseRestrictions.setSelected(Main.pref.getBoolean("changeset-query.advanced.open-restrictions", false));
-        cbTimeRestrictions.setSelected(Main.pref.getBoolean("changeset-query.advanced.time-restrictions", false));
-        cbBoundingBoxRestriction.setSelected(Main.pref.getBoolean("changeset-query.advanced.bbox-restrictions", false));
+        cbUserRestriction.setSelected(Config.getPref().getBoolean("changeset-query.advanced.user-restrictions", false));
+        cbOpenAndCloseRestrictions.setSelected(Config.getPref().getBoolean("changeset-query.advanced.open-restrictions", false));
+        cbTimeRestrictions.setSelected(Config.getPref().getBoolean("changeset-query.advanced.time-restrictions", false));
+        cbBoundingBoxRestriction.setSelected(Config.getPref().getBoolean("changeset-query.advanced.bbox-restrictions", false));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java	(revision 12846)
@@ -19,5 +19,4 @@
 import javax.swing.JRadioButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.UserIdentityManager;
@@ -27,4 +26,5 @@
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.io.ChangesetQuery;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -187,9 +187,9 @@
         BasicQuery q = getSelectedQuery();
         if (q == null) {
-            Main.pref.put("changeset-query.basic.query", null);
-        } else {
-            Main.pref.put("changeset-query.basic.query", q.toString());
-        }
-        Main.pref.putBoolean("changeset-query.basic.my-changesets-only", cbMyChangesetsOnly.isSelected());
+            Config.getPref().put("changeset-query.basic.query", null);
+        } else {
+            Config.getPref().put("changeset-query.basic.query", q.toString());
+        }
+        Config.getPref().putBoolean("changeset-query.basic.my-changesets-only", cbMyChangesetsOnly.isSelected());
     }
 
@@ -199,5 +199,5 @@
     public void restoreFromPreferences() {
         BasicQuery q;
-        String value = Main.pref.get("changeset-query.basic.query", null);
+        String value = Config.getPref().get("changeset-query.basic.query", null);
         if (value == null) {
             q = BasicQuery.MOST_RECENT_CHANGESETS;
@@ -212,5 +212,5 @@
         }
         rbQueries.get(q).setSelected(true);
-        boolean mineOnly = Main.pref.getBoolean("changeset-query.basic.my-changesets-only", false);
+        boolean mineOnly = Config.getPref().getBoolean("changeset-query.basic.my-changesets-only", false);
         mineOnly = mineOnly || q.equals(BasicQuery.MY_OPEN_CHANGESETS);
         cbMyChangesetsOnly.setSelected(mineOnly);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/OpenAndCloseStateRestrictionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/OpenAndCloseStateRestrictionPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/OpenAndCloseStateRestrictionPanel.java	(revision 12846)
@@ -13,7 +13,7 @@
 import javax.swing.JRadioButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.io.ChangesetQuery;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -109,9 +109,9 @@
     public void rememberSettings() {
         if (rbBoth.isSelected()) {
-            Main.pref.put(PREF_QUERY_TYPE, "both");
+            Config.getPref().put(PREF_QUERY_TYPE, "both");
         } else if (rbOpenOnly.isSelected()) {
-            Main.pref.put(PREF_QUERY_TYPE, "open");
+            Config.getPref().put(PREF_QUERY_TYPE, "open");
         } else if (rbClosedOnly.isSelected()) {
-            Main.pref.put(PREF_QUERY_TYPE, "closed");
+            Config.getPref().put(PREF_QUERY_TYPE, "closed");
         }
     }
@@ -121,5 +121,5 @@
      */
     public void restoreFromSettings() {
-        String v = Main.pref.get(PREF_QUERY_TYPE, "open");
+        String v = Config.getPref().get(PREF_QUERY_TYPE, "open");
         rbBoth.setSelected("both".equals(v));
         rbOpenOnly.setSelected("open".equals(v));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/TimeRestrictionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/TimeRestrictionPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/TimeRestrictionPanel.java	(revision 12846)
@@ -22,5 +22,4 @@
 import javax.swing.JRadioButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -29,4 +28,5 @@
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.io.ChangesetQuery;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -296,14 +296,14 @@
         String prefRoot = "changeset-query.advanced.time-restrictions";
         if (rbClosedAfter.isSelected()) {
-            Main.pref.put(prefRoot + ".query-type", "closed-after");
+            Config.getPref().put(prefRoot + ".query-type", "closed-after");
         } else if (rbClosedAfterAndCreatedBefore.isSelected()) {
-            Main.pref.put(prefRoot + ".query-type", "closed-after-created-before");
-        }
-        Main.pref.put(prefRoot + ".closed-after.date", tfClosedAfterDate1.getText());
-        Main.pref.put(prefRoot + ".closed-after.time", tfClosedAfterTime1.getText());
-        Main.pref.put(prefRoot + ".closed-created.closed.date", tfClosedAfterDate2.getText());
-        Main.pref.put(prefRoot + ".closed-created.closed.time", tfClosedAfterTime2.getText());
-        Main.pref.put(prefRoot + ".closed-created.created.date", tfCreatedBeforeDate.getText());
-        Main.pref.put(prefRoot + ".closed-created.created.time", tfCreatedBeforeTime.getText());
+            Config.getPref().put(prefRoot + ".query-type", "closed-after-created-before");
+        }
+        Config.getPref().put(prefRoot + ".closed-after.date", tfClosedAfterDate1.getText());
+        Config.getPref().put(prefRoot + ".closed-after.time", tfClosedAfterTime1.getText());
+        Config.getPref().put(prefRoot + ".closed-created.closed.date", tfClosedAfterDate2.getText());
+        Config.getPref().put(prefRoot + ".closed-created.closed.time", tfClosedAfterTime2.getText());
+        Config.getPref().put(prefRoot + ".closed-created.created.date", tfCreatedBeforeDate.getText());
+        Config.getPref().put(prefRoot + ".closed-created.created.time", tfCreatedBeforeTime.getText());
     }
 
@@ -313,5 +313,5 @@
     public void restoreFromSettings() {
         String prefRoot = "changeset-query.advanced.open-restrictions";
-        String v = Main.pref.get(prefRoot + ".query-type", "closed-after");
+        String v = Config.getPref().get(prefRoot + ".query-type", "closed-after");
         rbClosedAfter.setSelected("closed-after".equals(v));
         rbClosedAfterAndCreatedBefore.setSelected("closed-after-created-before".equals(v));
@@ -319,10 +319,10 @@
             rbClosedAfter.setSelected(true);
         }
-        tfClosedAfterDate1.setText(Main.pref.get(prefRoot + ".closed-after.date", ""));
-        tfClosedAfterTime1.setText(Main.pref.get(prefRoot + ".closed-after.time", ""));
-        tfClosedAfterDate2.setText(Main.pref.get(prefRoot + ".closed-created.closed.date", ""));
-        tfClosedAfterTime2.setText(Main.pref.get(prefRoot + ".closed-created.closed.time", ""));
-        tfCreatedBeforeDate.setText(Main.pref.get(prefRoot + ".closed-created.created.date", ""));
-        tfCreatedBeforeTime.setText(Main.pref.get(prefRoot + ".closed-created.created.time", ""));
+        tfClosedAfterDate1.setText(Config.getPref().get(prefRoot + ".closed-after.date", ""));
+        tfClosedAfterTime1.setText(Config.getPref().get(prefRoot + ".closed-after.time", ""));
+        tfClosedAfterDate2.setText(Config.getPref().get(prefRoot + ".closed-created.closed.date", ""));
+        tfClosedAfterTime2.setText(Config.getPref().get(prefRoot + ".closed-created.closed.time", ""));
+        tfCreatedBeforeDate.setText(Config.getPref().get(prefRoot + ".closed-created.created.date", ""));
+        tfCreatedBeforeTime.setText(Config.getPref().get(prefRoot + ".closed-created.created.time", ""));
         if (!valClosedAfterDate1.isValid()) {
             tfClosedAfterDate1.setText("");
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UserRestrictionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UserRestrictionPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UserRestrictionPanel.java	(revision 12846)
@@ -18,5 +18,4 @@
 import javax.swing.JRadioButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
@@ -27,4 +26,5 @@
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.io.ChangesetQuery;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -261,12 +261,12 @@
     public void rememberSettings() {
         if (rbRestrictToMyself.isSelected()) {
-            Main.pref.put(PREF_QUERY_TYPE, "mine");
+            Config.getPref().put(PREF_QUERY_TYPE, "mine");
         } else if (rbRestrictToUid.isSelected()) {
-            Main.pref.put(PREF_QUERY_TYPE, "uid");
+            Config.getPref().put(PREF_QUERY_TYPE, "uid");
         } else if (rbRestrictToUserName.isSelected()) {
-            Main.pref.put(PREF_QUERY_TYPE, "username");
-        }
-        Main.pref.put(PREF_ROOT + ".uid", tfUid.getText());
-        Main.pref.put(PREF_ROOT + ".username", tfUserName.getText());
+            Config.getPref().put(PREF_QUERY_TYPE, "username");
+        }
+        Config.getPref().put(PREF_ROOT + ".uid", tfUid.getText());
+        Config.getPref().put(PREF_ROOT + ".username", tfUserName.getText());
     }
 
@@ -275,5 +275,5 @@
      */
     public void restoreFromSettings() {
-        String v = Main.pref.get(PREF_QUERY_TYPE, "mine");
+        String v = Config.getPref().get(PREF_QUERY_TYPE, "mine");
         if ("mine".equals(v)) {
             UserIdentityManager im = UserIdentityManager.getInstance();
@@ -288,9 +288,9 @@
             rbRestrictToUserName.setSelected(true);
         }
-        tfUid.setText(Main.pref.get(PREF_ROOT + ".uid", ""));
+        tfUid.setText(Config.getPref().get(PREF_ROOT + ".uid", ""));
         if (!valUid.isValid()) {
             tfUid.setText("");
         }
-        tfUserName.setText(Main.pref.get(PREF_ROOT + ".username", ""));
+        tfUserName.setText(Config.getPref().get(PREF_ROOT + ".username", ""));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 12846)
@@ -100,4 +100,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.GBC;
@@ -257,5 +258,5 @@
 
         // combine both tables and wrap them in a scrollPane
-        boolean top = Main.pref.getBoolean("properties.presets.top", true);
+        boolean top = Config.getPref().getBoolean("properties.presets.top", true);
         if (top) {
             bothTables.add(presets, GBC.std().fill(GBC.HORIZONTAL).insets(5, 2, 5, 2).anchor(GBC.NORTHWEST));
@@ -295,5 +296,5 @@
         editHelper.loadTagsIfNeeded();
 
-        Main.pref.addKeyPreferenceChangeListener("display.discardable-keys", preferenceListener);
+        Config.getPref().addKeyPreferenceChangeListener("display.discardable-keys", preferenceListener);
     }
 
@@ -341,5 +342,5 @@
      */
     private void setupBlankSpaceMenu() {
-        if (Main.pref.getBoolean("properties.menu.add_edit_delete", true)) {
+        if (Config.getPref().getBoolean("properties.menu.add_edit_delete", true)) {
             blankSpaceMenuHandler.addAction(addAction);
             PopupMenuLauncher launcher = new BlankSpaceMenuLauncher(blankSpaceMenu);
@@ -354,5 +355,5 @@
     private void setupMembershipMenu() {
         // setting up the membership table
-        if (Main.pref.getBoolean("properties.menu.add_edit_delete", true)) {
+        if (Config.getPref().getBoolean("properties.menu.add_edit_delete", true)) {
             membershipMenuHandler.addAction(editAction);
             membershipMenuHandler.addAction(deleteAction);
@@ -406,5 +407,5 @@
      */
     private void setupTagsMenu() {
-        if (Main.pref.getBoolean("properties.menu.add_edit_delete", true)) {
+        if (Config.getPref().getBoolean("properties.menu.add_edit_delete", true)) {
             tagMenu.add(addAction);
             tagMenu.add(editAction);
@@ -541,5 +542,5 @@
     public void destroy() {
         super.destroy();
-        Main.pref.removeKeyPreferenceChangeListener("display.discardable-keys", preferenceListener);
+        Config.getPref().removeKeyPreferenceChangeListener("display.discardable-keys", preferenceListener);
         Container parent = pluginHook.getParent();
         if (parent != null) {
@@ -573,5 +574,5 @@
         tagData.setRowCount(0);
 
-        final boolean displayDiscardableKeys = Main.pref.getBoolean("display.discardable-keys", false);
+        final boolean displayDiscardableKeys = Config.getPref().getBoolean("display.discardable-keys", false);
         final Map<String, Integer> keyCount = new HashMap<>();
         final Map<String, String> tags = new HashMap<>();
@@ -1136,5 +1137,5 @@
         public void actionPerformed(ActionEvent e) {
             try {
-                String base = Main.pref.get("url.openstreetmap-wiki", "https://wiki.openstreetmap.org/wiki/");
+                String base = Config.getPref().get("url.openstreetmap-wiki", "https://wiki.openstreetmap.org/wiki/");
                 String lang = LanguageInfo.getWikiLanguagePrefix();
                 final List<URI> uris = new ArrayList<>();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java	(revision 12846)
@@ -9,7 +9,7 @@
 
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.data.osm.search.SearchSetting;
-import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.preferences.ListProperty;
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 12846)
@@ -73,7 +73,7 @@
 import org.openstreetmap.josm.data.osm.search.SearchSetting;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.data.preferences.ListProperty;
 import org.openstreetmap.josm.data.preferences.EnumProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.data.preferences.ListProperty;
 import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 12846)
@@ -100,4 +100,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -429,5 +430,5 @@
                 }
         );
-        tfRole.setText(Main.pref.get("relation.editor.generic.lastrole", ""));
+        tfRole.setText(Config.getPref().get("relation.editor.generic.lastrole", ""));
         return tfRole;
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 12846)
@@ -40,4 +40,5 @@
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -129,5 +130,5 @@
 
     private void initHighlighting() {
-        highlightEnabled = Main.pref.getBoolean("draw.target-highlight", true);
+        highlightEnabled = Config.getPref().getBoolean("draw.target-highlight", true);
         if (!highlightEnabled) return;
         getMemberTableModel().getSelectionModel().addListSelectionListener(highlighterListener);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AbstractRelationEditorAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AbstractRelationEditorAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AbstractRelationEditorAction.java	(revision 12846)
@@ -8,7 +8,7 @@
 import javax.swing.event.TableModelListener;
 
+import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
-import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddFromSelectionAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddFromSelectionAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddFromSelectionAction.java	(revision 12846)
@@ -11,7 +11,7 @@
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
+import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
-import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTable;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java	(revision 12846)
@@ -13,10 +13,11 @@
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
+import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
-import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.tagging.TagEditorModel;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -60,5 +61,5 @@
             if (ret == 0) { //Yes, save the changes
                 //copied from OKAction.run()
-                Main.pref.put("relation.editor.generic.lastrole", tfRole.getText());
+                Config.getPref().put("relation.editor.generic.lastrole", tfRole.getText());
                 if (!applyChanges())
                     return;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java	(revision 12846)
@@ -6,11 +6,11 @@
 import java.awt.event.ActionEvent;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
-import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.tagging.TagEditorModel;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -40,5 +40,5 @@
     @Override
     public void actionPerformed(ActionEvent e) {
-        Main.pref.put("relation.editor.generic.lastrole", tfRole.getText());
+        Config.getPref().put("relation.editor.generic.lastrole", tfRole.getText());
         memberTable.stopHighlighting();
         if (!applyChanges())
Index: trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java	(revision 12846)
@@ -23,5 +23,4 @@
 import javax.swing.UIManager;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.ChangesetQueryTask;
 import org.openstreetmap.josm.data.Bounds;
@@ -39,4 +38,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.ChangesetQuery;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
@@ -262,5 +262,5 @@
         }
         // Then add manual bookmarks previously saved in local preferences
-        Collection<Collection<String>> args = Main.pref.getArray("bookmarks", null);
+        List<List<String>> args = Config.getPref().getListOfLists("bookmarks", null);
         if (args != null) {
             List<Bookmark> bookmarks = new LinkedList<>();
@@ -315,5 +315,5 @@
             coll.add(Arrays.asList(array));
         }
-        Main.pref.putListOfLists("bookmarks", coll);
+        Config.getPref().putListOfLists("bookmarks", coll);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 12846)
@@ -50,4 +50,5 @@
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.plugins.PluginHandler;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -363,5 +364,5 @@
         DOWNLOAD_ZOOMTODATA.put(cbZoomToDownloadedData.isSelected());
         if (currentBounds != null) {
-            Main.pref.put("osm-download.bounds", currentBounds.encodeAsString(";"));
+            Config.getPref().put("osm-download.bounds", currentBounds.encodeAsString(";"));
         }
     }
@@ -406,5 +407,5 @@
      */
     public static Bounds getSavedDownloadBounds() {
-        String value = Main.pref.get("osm-download.bounds");
+        String value = Config.getPref().get("osm-download.bounds");
         if (!value.isEmpty()) {
             try {
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java	(revision 12846)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.gui.dialogs.OsmIdSelectionDialog;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -59,12 +60,12 @@
     protected Collection<Component> getComponentsBeforeHelp() {
         newLayer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
-        newLayer.setSelected(Main.pref.getBoolean("download.newlayer"));
+        newLayer.setSelected(Config.getPref().getBoolean("download.newlayer"));
 
         referrers.setToolTipText(tr("Select if the referrers of the object should be downloaded as well, i.e.,"
                 + "parent relations and for nodes, additionally, parent ways"));
-        referrers.setSelected(Main.pref.getBoolean("downloadprimitive.referrers", true));
+        referrers.setSelected(Config.getPref().getBoolean("downloadprimitive.referrers", true));
 
         fullRel.setToolTipText(tr("Select if the members of a relation should be downloaded as well"));
-        fullRel.setSelected(Main.pref.getBoolean("downloadprimitive.full", true));
+        fullRel.setSelected(Config.getPref().getBoolean("downloadprimitive.full", true));
 
         cbType.addItemListener(e -> referrers.setText(cbType.getType() == OsmPrimitiveType.NODE
@@ -103,7 +104,7 @@
         super.windowClosed(e);
         if (e != null && e.getComponent() == this && getValue() == 1) {
-            Main.pref.putBoolean("downloadprimitive.referrers", referrers.isSelected());
-            Main.pref.putBoolean("downloadprimitive.full", fullRel.isSelected());
-            Main.pref.putBoolean("download.newlayer", newLayer.isSelected());
+            Config.getPref().putBoolean("downloadprimitive.referrers", referrers.isSelected());
+            Config.getPref().putBoolean("downloadprimitive.full", fullRel.isSelected());
+            Config.getPref().putBoolean("download.newlayer", newLayer.isSelected());
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadSettings.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadSettings.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadSettings.java	(revision 12846)
@@ -2,7 +2,7 @@
 package org.openstreetmap.josm.gui.download;
 
+import java.util.Optional;
+
 import org.openstreetmap.josm.data.Bounds;
-
-import java.util.Optional;
 
 /**
Index: trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java	(revision 12846)
@@ -19,5 +19,4 @@
 import javax.swing.event.ChangeListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.AbstractDownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
@@ -32,4 +31,5 @@
 import org.openstreetmap.josm.gui.MapFrame;
 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.ImageProvider;
@@ -298,8 +298,8 @@
             } else if (isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
                 // see max_note_request_area in https://github.com/openstreetmap/openstreetmap-website/blob/master/config/example.application.yml
-                isAreaTooLarge = bbox.getArea() > Main.pref.getDouble("osm-server.max-request-area-notes", 25);
+                isAreaTooLarge = bbox.getArea() > Config.getPref().getDouble("osm-server.max-request-area-notes", 25);
             } else {
                 // see max_request_area in https://github.com/openstreetmap/openstreetmap-website/blob/master/config/example.application.yml
-                isAreaTooLarge = bbox.getArea() > Main.pref.getDouble("osm-server.max-request-area", 0.25);
+                isAreaTooLarge = bbox.getArea() > Config.getPref().getDouble("osm-server.max-request-area", 0.25);
             }
 
Index: trunk/src/org/openstreetmap/josm/gui/download/OverpassQueryList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/OverpassQueryList.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/OverpassQueryList.java	(revision 12846)
@@ -49,4 +49,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.gui.widgets.SearchTextResultListPanel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -254,5 +255,5 @@
         }
 
-        Main.pref.putListOfMaps(PREFERENCE_ITEMS, toSave);
+        Config.getPref().putListOfMaps(PREFERENCE_ITEMS, toSave);
     }
 
@@ -263,5 +264,5 @@
     private static Map<String, SelectorItem> restorePreferences() {
         Collection<Map<String, String>> toRetrieve =
-                Main.pref.getListOfMaps(PREFERENCE_ITEMS, Collections.emptyList());
+                Config.getPref().getListOfMaps(PREFERENCE_ITEMS, Collections.emptyList());
         Map<String, SelectorItem> result = new HashMap<>();
 
Index: trunk/src/org/openstreetmap/josm/gui/download/PlaceSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/PlaceSelection.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/download/PlaceSelection.java	(revision 12846)
@@ -55,4 +55,5 @@
 import org.openstreetmap.josm.io.NameFinder.SearchResult;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.HttpClient;
@@ -105,5 +106,5 @@
         lpanel.add(new JLabel(tr("Choose the server for searching:")));
         lpanel.add(server);
-        String s = Main.pref.get("namefinder.server", SERVERS[0].name);
+        String s = Config.getPref().get("namefinder.server", SERVERS[0].name);
         for (int i = 0; i < SERVERS.length; ++i) {
             if (SERVERS[i].name.equals(s)) {
@@ -115,5 +116,5 @@
         cbSearchExpression = new HistoryComboBox();
         cbSearchExpression.setToolTipText(tr("Enter a place name to search for"));
-        List<String> cmtHistory = new LinkedList<>(Main.pref.getList(HISTORY_KEY, new LinkedList<String>()));
+        List<String> cmtHistory = new LinkedList<>(Config.getPref().getList(HISTORY_KEY, new LinkedList<String>()));
         Collections.reverse(cmtHistory);
         cbSearchExpression.setPossibleItems(cmtHistory);
@@ -189,5 +190,5 @@
                 return;
             cbSearchExpression.addCurrentItemToHistory();
-            Main.pref.putList(HISTORY_KEY, cbSearchExpression.getHistory());
+            Config.getPref().putList(HISTORY_KEY, cbSearchExpression.getHistory());
             NameQueryTask task = new NameQueryTask(cbSearchExpression.getText());
             MainApplication.worker.submit(task);
@@ -227,5 +228,5 @@
             this.searchExpression = searchExpression;
             useserver = (Server) server.getSelectedItem();
-            Main.pref.put("namefinder.server", useserver.name);
+            Config.getPref().put("namefinder.server", useserver.name);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpUtil.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpUtil.java	(revision 12846)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.actions.HelpAction;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.LanguageInfo;
 import org.openstreetmap.josm.tools.LanguageInfo.LocaleType;
@@ -33,5 +34,5 @@
      */
     public static String getWikiBaseUrl() {
-        return Main.pref.get("help.baseurl", Main.getJOSMWebsite());
+        return Config.getPref().get("help.baseurl", Main.getJOSMWebsite());
     }
 
@@ -132,5 +133,5 @@
         if (ret == null)
             return ret;
-        ret = '/' + ret + Main.pref.get("help.pathhelp", "/Help").replaceAll("^\\/+", ""); // remove leading /
+        ret = '/' + ret + Config.getPref().get("help.pathhelp", "/Help").replaceAll("^\\/+", ""); // remove leading /
         return ret.replaceAll("\\/+", "\\/"); // collapse sequences of //
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 12846)
@@ -35,4 +35,5 @@
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.io.XmlWriter;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OpenBrowser;
@@ -341,5 +342,5 @@
         Object val = tbl.getColumnModel().getColumn(col).getHeaderValue();
         Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, -1, col);
-        maxwidth = Math.max(comp.getPreferredSize().width + Main.pref.getInt("table.header-inset", 0), maxwidth);
+        maxwidth = Math.max(comp.getPreferredSize().width + Config.getPref().getInt("table.header-inset", 0), maxwidth);
 
         int spacing = tbl.getIntercellSpacing().width;
Index: trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 12846)
@@ -28,9 +28,9 @@
 import javax.swing.event.HyperlinkEvent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.GBC;
@@ -78,5 +78,5 @@
         hcbUploadComment.setToolTipText(tr("Enter an upload comment"));
         hcbUploadComment.setMaxTextLength(Changeset.MAX_CHANGESET_TAG_LENGTH);
-        List<String> cmtHistory = new LinkedList<>(Main.pref.getList(HISTORY_KEY, new LinkedList<String>()));
+        List<String> cmtHistory = new LinkedList<>(Config.getPref().getList(HISTORY_KEY, new LinkedList<String>()));
         Collections.reverse(cmtHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         hcbUploadComment.setPossibleItems(cmtHistory);
@@ -100,5 +100,5 @@
         hcbUploadSource.setToolTipText(tr("Enter a source"));
         hcbUploadSource.setMaxTextLength(Changeset.MAX_CHANGESET_TAG_LENGTH);
-        List<String> sourceHistory = new LinkedList<>(Main.pref.getList(SOURCE_HISTORY_KEY, getDefaultSources()));
+        List<String> sourceHistory = new LinkedList<>(Config.getPref().getList(SOURCE_HISTORY_KEY, getDefaultSources()));
         Collections.reverse(sourceHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         hcbUploadSource.setPossibleItems(sourceHistory);
@@ -166,9 +166,9 @@
         // store the history of comments
         hcbUploadComment.addCurrentItemToHistory();
-        Main.pref.putList(HISTORY_KEY, hcbUploadComment.getHistory());
-        Main.pref.putInt(HISTORY_LAST_USED_KEY, (int) (TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())));
+        Config.getPref().putList(HISTORY_KEY, hcbUploadComment.getHistory());
+        Config.getPref().putInt(HISTORY_LAST_USED_KEY, (int) (TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())));
         // store the history of sources
         hcbUploadSource.addCurrentItemToHistory();
-        Main.pref.putList(SOURCE_HISTORY_KEY, hcbUploadSource.getHistory());
+        Config.getPref().putList(SOURCE_HISTORY_KEY, hcbUploadSource.getHistory());
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java	(revision 12846)
@@ -23,5 +23,4 @@
 import javax.swing.event.ListDataListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetCache;
@@ -29,4 +28,5 @@
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -156,5 +156,5 @@
         cbCloseAfterUpload.setToolTipText(tr("Select to close the changeset after the next upload"));
         add(cbCloseAfterUpload, gc);
-        cbCloseAfterUpload.setSelected(Main.pref.getBoolean("upload.changeset.close", true));
+        cbCloseAfterUpload.setSelected(Config.getPref().getBoolean("upload.changeset.close", true));
         cbCloseAfterUpload.addItemListener(new CloseAfterUploadItemStateListener());
 
@@ -256,9 +256,9 @@
             case ItemEvent.SELECTED:
                 firePropertyChange(CLOSE_CHANGESET_AFTER_UPLOAD, false, true);
-                Main.pref.putBoolean("upload.changeset.close", true);
+                Config.getPref().putBoolean("upload.changeset.close", true);
                 break;
             case ItemEvent.DESELECTED:
                 firePropertyChange(CLOSE_CHANGESET_AFTER_UPLOAD, true, false);
-                Main.pref.putBoolean("upload.changeset.close", false);
+                Config.getPref().putBoolean("upload.changeset.close", false);
                 break;
             default: // Do nothing
Index: trunk/src/org/openstreetmap/josm/gui/io/CredentialDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/CredentialDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/CredentialDialog.java	(revision 12846)
@@ -42,4 +42,5 @@
 import org.openstreetmap.josm.io.auth.AbstractCredentialsAgent;
 import org.openstreetmap.josm.io.auth.CredentialsAgentResponse;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -355,8 +356,7 @@
             tfUserName.setToolTipText(tr("Please enter the user name for authenticating at your proxy server"));
             tfPassword.setToolTipText(tr("Please enter the password for authenticating at your proxy server"));
-            lblHeading.setText(
-                    "<html>" + tr("Authenticating at the HTTP proxy ''{0}'' failed. Please enter a valid username and a valid password.",
-                            Main.pref.get(DefaultProxySelector.PROXY_HTTP_HOST) + ':' +
-                            Main.pref.get(DefaultProxySelector.PROXY_HTTP_PORT)) + "</html>");
+            lblHeading.setText("<html>" + tr("Authenticating at the HTTP proxy ''{0}'' failed. Please enter a valid username and a valid password.",
+                            Config.getPref().get(DefaultProxySelector.PROXY_HTTP_HOST) + ':' +
+                            Config.getPref().get(DefaultProxySelector.PROXY_HTTP_PORT)) + "</html>");
             lblWarning.setText("<html>" +
                     tr("Warning: depending on the authentication method the proxy server uses the password may be transferred unencrypted.")
Index: trunk/src/org/openstreetmap/josm/gui/io/CustomConfigurator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/CustomConfigurator.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/CustomConfigurator.java	(revision 12846)
@@ -50,4 +50,5 @@
 import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.plugins.ReadLocalPluginInformationTask;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.LanguageInfo;
 import org.openstreetmap.josm.tools.Logging;
@@ -400,5 +401,5 @@
                         MainApplication.worker.submit(pluginDownloadTask);
                     }
-                    List<String> pls = new ArrayList<>(Main.pref.getList("plugins"));
+                    List<String> pls = new ArrayList<>(Config.getPref().getList("plugins"));
                     for (PluginInformation pi2: toInstallPlugins) {
                         if (!pls.contains(pi2.name)) {
@@ -413,5 +414,5 @@
                         new File(Main.pref.getPluginsDirectory(), pi4.name+".jar").deleteOnExit();
                     }
-                    Main.pref.putList("plugins", pls);
+                    Config.getPref().putList("plugins", pls);
                 });
             }
Index: trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(revision 12846)
@@ -17,7 +17,7 @@
 import javax.swing.event.MenuListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -58,5 +58,5 @@
     private void rebuild() {
         removeAll();
-        Collection<String> fileHistory = Main.pref.getList("file-open.history");
+        Collection<String> fileHistory = Config.getPref().getList("file-open.history");
 
         for (final String file : fileHistory) {
@@ -101,5 +101,5 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            Main.pref.putList("file-open.history", null);
+            Config.getPref().putList("file-open.history", null);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 12846)
@@ -60,4 +60,5 @@
 import org.openstreetmap.josm.io.UploadStrategy;
 import org.openstreetmap.josm.io.UploadStrategySpecification;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageOverlay;
@@ -252,5 +253,5 @@
         setMinimumSize(new Dimension(600, 350));
 
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
     }
 
@@ -653,6 +654,6 @@
 
     private static String getLastChangesetTagFromHistory(String historyKey, List<String> def) {
-        Collection<String> history = Main.pref.getList(historyKey, def);
-        int age = (int) (System.currentTimeMillis() / 1000 - Main.pref.getInt(BasicUploadSettingsPanel.HISTORY_LAST_USED_KEY, 0));
+        Collection<String> history = Config.getPref().getList(historyKey, def);
+        int age = (int) (System.currentTimeMillis() / 1000 - Config.getPref().getInt(BasicUploadSettingsPanel.HISTORY_LAST_USED_KEY, 0));
         if (history != null && age < Main.pref.getLong(BasicUploadSettingsPanel.HISTORY_MAX_AGE_KEY, TimeUnit.HOURS.toMillis(4))
                 && !history.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java	(revision 12846)
@@ -31,5 +31,4 @@
 import javax.swing.event.DocumentListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -39,4 +38,5 @@
 import org.openstreetmap.josm.io.UploadStrategy;
 import org.openstreetmap.josm.io.UploadStrategySpecification;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -323,5 +323,5 @@
         UploadStrategy strategy = UploadStrategy.getFromPreferences();
         rbStrategy.get(strategy).setSelected(true);
-        int chunkSize = Main.pref.getInt("osm-server.upload-strategy.chunk-size", 1);
+        int chunkSize = Config.getPref().getInt("osm-server.upload-strategy.chunk-size", 1);
         tfChunkSize.setText(Integer.toString(chunkSize));
         updateNumRequestsLabels();
@@ -337,5 +337,5 @@
         try {
             chunkSize = Integer.parseInt(tfChunkSize.getText().trim());
-            Main.pref.putInt("osm-server.upload-strategy.chunk-size", chunkSize);
+            Config.getPref().putInt("osm-server.upload-strategy.chunk-size", chunkSize);
         } catch (NumberFormatException e) {
             // don't save invalid value to preferences
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java	(revision 12846)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.GpxWriter;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.GBC;
@@ -110,5 +111,5 @@
         p.add(new JScrollPane(desc), GBC.eop().fill(GBC.BOTH));
 
-        JCheckBox author = new JCheckBox(tr("Add author information"), Main.pref.getBoolean("lastAddAuthor", true));
+        JCheckBox author = new JCheckBox(tr("Add author information"), Config.getPref().getBoolean("lastAddAuthor", true));
         p.add(author, GBC.eol());
 
@@ -162,10 +163,10 @@
         setCanceled(false);
 
-        Main.pref.putBoolean("lastAddAuthor", author.isSelected());
+        Config.getPref().putBoolean("lastAddAuthor", author.isSelected());
         if (!authorName.getText().isEmpty()) {
-            Main.pref.put("lastAuthorName", authorName.getText());
+            Config.getPref().put("lastAuthorName", authorName.getText());
         }
         if (!copyright.getText().isEmpty()) {
-            Main.pref.put("lastCopyright", copyright.getText());
+            Config.getPref().put("lastCopyright", copyright.getText());
         }
 
@@ -231,6 +232,5 @@
             }
             if (copyright.getText().isEmpty()) {
-                copyright.setText(Optional.ofNullable(data.getString(META_COPYRIGHT_LICENSE)).orElseGet(
-                        () -> Main.pref.get("lastCopyright", "https://creativecommons.org/licenses/by-sa/2.5")));
+                copyright.setText(Optional.ofNullable(data.getString(META_COPYRIGHT_LICENSE)).orElseGet(() -> Config.getPref().get("lastCopyright", "https://creativecommons.org/licenses/by-sa/2.5")));
                 copyright.setCaretPosition(0);
             }
@@ -280,6 +280,6 @@
             emailLabel.setEnabled(b);
             if (b) {
-                authorName.setText(Optional.ofNullable(data.getString(META_AUTHOR_NAME)).orElseGet(() -> Main.pref.get("lastAuthorName")));
-                email.setText(Optional.ofNullable(data.getString(META_AUTHOR_EMAIL)).orElseGet(() -> Main.pref.get("lastAuthorEmail")));
+                authorName.setText(Optional.ofNullable(data.getString(META_AUTHOR_NAME)).orElseGet(() -> Config.getPref().get("lastAuthorName")));
+                email.setText(Optional.ofNullable(data.getString(META_AUTHOR_EMAIL)).orElseGet(() -> Config.getPref().get("lastAuthorEmail")));
             } else {
                 authorName.setText("");
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxImporter.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxImporter.java	(revision 12846)
@@ -10,5 +10,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -20,4 +19,5 @@
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.xml.sax.SAXException;
@@ -95,6 +95,5 @@
      */
     public static ExtensionFileFilter getFileFilter() {
-        return ExtensionFileFilter.newFilterWithArchiveExtensions(
-            "gpx", Main.pref.get("save.extension.gpx", "gpx"), tr("GPX Files"), true);
+        return ExtensionFileFilter.newFilterWithArchiveExtensions("gpx", Config.getPref().get("save.extension.gpx", "gpx"), tr("GPX Files"), true);
     }
 
@@ -148,5 +147,5 @@
             gpxLayer = new GpxLayer(data, gpxLayerName, data.storageFile != null);
         }
-        if (Main.pref.getBoolean("marker.makeautomarkers", true) && !data.waypoints.isEmpty()) {
+        if (Config.getPref().getBoolean("marker.makeautomarkers", true) && !data.waypoints.isEmpty()) {
             markerLayer = new MarkerLayer(data, markerLayerName, data.storageFile, gpxLayer);
             if (markerLayer.data.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/NMEAImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/NMEAImporter.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/NMEAImporter.java	(revision 12846)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.nmea.NmeaReader;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -55,5 +56,5 @@
                 GuiHelper.runInEDT(() -> {
                     MainApplication.getLayerManager().addLayer(gpxLayer);
-                    if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
+                    if (Config.getPref().getBoolean("marker.makeautomarkers", true)) {
                         MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), fileFinal, gpxLayer);
                         if (!ml.data.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmExporter.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmExporter.java	(revision 12846)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.io.OsmWriter;
 import org.openstreetmap.josm.io.OsmWriterFactory;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -90,5 +91,5 @@
 
             doSave(file, layer);
-            if ((noBackup || !Main.pref.getBoolean("save.keepbackup", false)) && tmpFile != null) {
+            if ((noBackup || !Config.getPref().getBoolean("save.keepbackup", false)) && tmpFile != null) {
                 Utils.deleteFile(tmpFile);
             }
Index: trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java	(revision 12846)
@@ -46,4 +46,5 @@
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -193,5 +194,5 @@
             String filename = String.format("%1$s_%2$tY%2$tm%2$td_%2$tH%2$tM%2$tS%2$tL%3$s",
                     layer.layerFileName, now, index == 0 ? "" : ('_' + Integer.toString(index)));
-            File result = new File(autosaveDir, filename + '.' + Main.pref.get("autosave.extension", "osm"));
+            File result = new File(autosaveDir, filename + '.' + Config.getPref().get("autosave.extension", "osm"));
             try {
                 if (index > PROP_INDEX_LIMIT.get())
Index: trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 12846)
@@ -23,5 +23,4 @@
 import javax.swing.SwingUtilities;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.data.Bounds;
@@ -43,4 +42,5 @@
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.XmlWriter;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -165,5 +165,5 @@
             Point p = mv.getPoint(noteData.getSelectedNote().getLatLon());
 
-            g.setColor(ColorHelper.html2color(Main.pref.get("color.selected")));
+            g.setColor(ColorHelper.html2color(Config.getPref().get("color.selected")));
             g.drawRect(p.x - (iconWidth / 2), p.y - iconHeight,
                     iconWidth - 1, iconHeight - 1);
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 12846)
@@ -104,4 +104,5 @@
 import org.openstreetmap.josm.gui.widgets.FileChooserManager;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -430,10 +431,10 @@
     @Override public void paint(final Graphics2D g, final MapView mv, Bounds box) {
         boolean active = mv.getLayerManager().getActiveLayer() == this;
-        boolean inactive = !active && Main.pref.getBoolean("draw.data.inactive_color", true);
+        boolean inactive = !active && Config.getPref().getBoolean("draw.data.inactive_color", true);
         boolean virtual = !inactive && mv.isVirtualNodesEnabled();
 
         // draw the hatched area for non-downloaded region. only draw if we're the active
         // and bounds are defined; don't draw for inactive layers or loaded GPX files etc
-        if (active && Main.pref.getBoolean("draw.data.downloaded_area", true) && !data.getDataSources().isEmpty()) {
+        if (active && Config.getPref().getBoolean("draw.data.downloaded_area", true) && !data.getDataSources().isEmpty()) {
             // initialize area with current viewport
             Rectangle b = mv.getBounds();
@@ -872,5 +873,5 @@
             }
             MainApplication.getLayerManager().addLayer(gpxLayer);
-            if (Main.pref.getBoolean("marker.makeautomarkers", true) && !gpxData.waypoints.isEmpty()) {
+            if (Config.getPref().getBoolean("marker.makeautomarkers", true) && !gpxData.waypoints.isEmpty()) {
                 MainApplication.getLayerManager().addLayer(new MarkerLayer(gpxData, tr("Converted from: {0}", getName()), null, gpxLayer));
             }
@@ -1089,5 +1090,5 @@
         File file = getAssociatedFile();
         if (file == null && isRenamed()) {
-            StringBuilder filename = new StringBuilder(Main.pref.get("lastDirectory")).append('/').append(getName());
+            StringBuilder filename = new StringBuilder(Config.getPref().get("lastDirectory")).append('/').append(getName());
             if (!OsmImporter.FILE_FILTER.acceptName(filename.toString())) {
                 filename.append('.').append(extension);
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 12846)
@@ -79,4 +79,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ExifReader;
 import org.openstreetmap.josm.tools.GBC;
@@ -172,7 +173,7 @@
                 break;
             case DONE:
-                Main.pref.put("geoimage.timezone", timezone.formatTimezone());
-                Main.pref.put("geoimage.delta", delta.formatOffset());
-                Main.pref.putBoolean("geoimage.showThumbs", yLayer.useThumbs);
+                Config.getPref().put("geoimage.timezone", timezone.formatTimezone());
+                Config.getPref().put("geoimage.delta", delta.formatOffset());
+                Config.getPref().putBoolean("geoimage.showThumbs", yLayer.useThumbs);
 
                 yLayer.useThumbs = cbShowThumbs.isSelected();
@@ -421,5 +422,5 @@
             JosmComboBox<String> cbTimezones = new JosmComboBox<>(vtTimezones.toArray(new String[vtTimezones.size()]));
 
-            String tzId = Main.pref.get("geoimage.timezoneid", "");
+            String tzId = Config.getPref().get("geoimage.timezoneid", "");
             TimeZone defaultTz;
             if (tzId.isEmpty()) {
@@ -529,5 +530,5 @@
                 String tzValue = selectedTz.substring(pos + 1, selectedTz.length() - 1);
 
-                Main.pref.put("geoimage.timezoneid", tzId);
+                Config.getPref().put("geoimage.timezoneid", tzId);
                 tfOffset.setText(Offset.milliseconds(delta).formatOffset());
                 tfTimezone.setText(tzValue);
@@ -584,5 +585,5 @@
 
         try {
-            timezone = Timezone.parseTimezone(Optional.ofNullable(Main.pref.get("geoimage.timezone", "0:00")).orElse("0:00"));
+            timezone = Timezone.parseTimezone(Optional.ofNullable(Config.getPref().get("geoimage.timezone", "0:00")).orElse("0:00"));
         } catch (ParseException e) {
             timezone = Timezone.ZERO;
@@ -593,5 +594,5 @@
 
         try {
-            delta = Offset.parseOffset(Main.pref.get("geoimage.delta", "0"));
+            delta = Offset.parseOffset(Config.getPref().get("geoimage.delta", "0"));
         } catch (ParseException e) {
             delta = Offset.ZERO;
@@ -627,5 +628,5 @@
         labelPosition.setEnabled(cbExifImg.isEnabled() || cbTaggedImg.isEnabled());
 
-        boolean ticked = yLayer.thumbsLoaded || Main.pref.getBoolean("geoimage.showThumbs", false);
+        boolean ticked = yLayer.thumbsLoaded || Config.getPref().getBoolean("geoimage.showThumbs", false);
         cbShowThumbs = new JCheckBox(tr("Show Thumbnail images on the map"), ticked);
         cbShowThumbs.setEnabled(!yLayer.thumbsLoaded);
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 12846)
@@ -26,5 +26,5 @@
 import javax.swing.JComponent;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ExifReader;
 import org.openstreetmap.josm.tools.Logging;
@@ -58,5 +58,5 @@
     private String osdText;
 
-    private static final int DRAG_BUTTON = Main.pref.getBoolean("geoimage.agpifo-style-drag-and-zoom", false) ? 1 : 3;
+    private static final int DRAG_BUTTON = Config.getPref().getBoolean("geoimage.agpifo-style-drag-and-zoom", false) ? 1 : 3;
     private static final int ZOOM_BUTTON = DRAG_BUTTON == 1 ? 3 : 1;
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java	(revision 12846)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.data.cache.JCSCacheManager;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ExifReader;
 import org.openstreetmap.josm.tools.Logging;
@@ -38,5 +39,5 @@
     private MediaTracker tracker;
     private ICacheAccess<String, BufferedImageCacheEntry> cache;
-    private final boolean cacheOff = Main.pref.getBoolean("geoimage.noThumbnailCache", false);
+    private final boolean cacheOff = Config.getPref().getBoolean("geoimage.noThumbnailCache", false);
 
     private ThumbsLoader(Collection<ImageEntry> data, GeoImageLayer layer) {
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java	(revision 12846)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.gui.widgets.UrlLabel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -119,5 +120,5 @@
             for (Marker marker : layer.data) {
                 final Node node = new Node(marker.getCoor());
-                final Collection<String> mapping = Main.pref.getList("gpx.to-osm-mapping", Arrays.asList(
+                final Collection<String> mapping = Config.getPref().getList("gpx.to-osm-mapping", Arrays.asList(
                         GpxConstants.GPX_NAME, "name",
                         GpxConstants.GPX_DESC, "description",
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java	(revision 12846)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.widgets.DateEditorWithSlider;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -105,5 +106,5 @@
         Main.pref.putLong(prefDateMin, dateFrom.getDate().getTime());
         Main.pref.putLong(prefDateMax, dateTo.getDate().getTime());
-        Main.pref.putBoolean(prefDate0, noTimestampCb.isSelected());
+        Config.getPref().putBoolean(prefDate0, noTimestampCb.isSelected());
     }
 
@@ -117,5 +118,5 @@
         long t2 = Main.pref.getLong(prefDateMax, 0);
         if (t2 != 0) dateTo.setDate(new Date(t2));
-        noTimestampCb.setSelected(Main.pref.getBoolean(prefDate0, false));
+        noTimestampCb.setSelected(Config.getPref().getBoolean(prefDate0, false));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongPanel.java	(revision 12846)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -60,8 +61,8 @@
         this.prefNear = prefNear;
 
-        cbDownloadOsmData = new JCheckBox(tr("OpenStreetMap data"), Main.pref.getBoolean(prefOsm, true));
+        cbDownloadOsmData = new JCheckBox(tr("OpenStreetMap data"), Config.getPref().getBoolean(prefOsm, true));
         cbDownloadOsmData.setToolTipText(tr("Select to download OSM data."));
         add(cbDownloadOsmData, GBC.std().insets(1, 5, 1, 5));
-        cbDownloadGpxData = new JCheckBox(tr("Raw GPS data"), Main.pref.getBoolean(prefGps, false));
+        cbDownloadGpxData = new JCheckBox(tr("Raw GPS data"), Config.getPref().getBoolean(prefGps, false));
         cbDownloadGpxData.setToolTipText(tr("Select to download GPS traces."));
         add(cbDownloadGpxData, GBC.eol().insets(5, 5, 1, 5));
@@ -85,5 +86,5 @@
             add(new JLabel(tr("Download near:")), GBC.eol());
             downloadNear = new JList<>(new String[]{tr("track only"), tr("waypoints only"), tr("track and waypoints")});
-            downloadNear.setSelectedIndex(Main.pref.getInt(prefNear, 0));
+            downloadNear.setSelectedIndex(Config.getPref().getInt(prefNear, 0));
             add(downloadNear, GBC.eol());
         } else {
@@ -138,10 +139,10 @@
      */
     protected final void rememberSettings() {
-        Main.pref.putBoolean(prefOsm, isDownloadOsmData());
-        Main.pref.putBoolean(prefGps, isDownloadGpxData());
-        Main.pref.putDouble(prefDist, getDistance());
-        Main.pref.putDouble(prefArea, getArea());
+        Config.getPref().putBoolean(prefOsm, isDownloadOsmData());
+        Config.getPref().putBoolean(prefGps, isDownloadGpxData());
+        Config.getPref().putDouble(prefDist, getDistance());
+        Config.getPref().putDouble(prefArea, getArea());
         if (prefNear != null) {
-            Main.pref.putInt(prefNear, getNear());
+            Config.getPref().putInt(prefNear, getNear());
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 12846)
@@ -53,4 +53,5 @@
 import org.openstreetmap.josm.gui.layer.MapViewPaintable.PaintableInvalidationListener;
 import org.openstreetmap.josm.io.CachedFile;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ColorScale;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -183,5 +184,5 @@
 
     private void setupColors() {
-        hdopAlpha = Main.pref.getInt("hdop.color.alpha", -1);
+        hdopAlpha = Config.getPref().getInt("hdop.color.alpha", -1);
         velocityScale = ColorScale.createHSBScale(256);
         /** Colors (without custom alpha channel, if given) for HDOP painting. **/
@@ -320,7 +321,7 @@
         colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", spec, false);
         /* good HDOP's are between 1 and 3, very bad HDOP's go into 3 digit values */
-        hdoprange = Main.pref.getInt("hdop.range", 7);
-        minTrackDurationForTimeColoring = Main.pref.getInt("draw.rawgps.date-coloring-min-dt", 60);
-        largePointAlpha = Main.pref.getInt("draw.rawgps.large.alpha", -1) & 0xFF;
+        hdoprange = Config.getPref().getInt("hdop.range", 7);
+        minTrackDurationForTimeColoring = Config.getPref().getInt("draw.rawgps.date-coloring-min-dt", 60);
+        largePointAlpha = Config.getPref().getInt("draw.rawgps.large.alpha", -1) & 0xFF;
 
         // get heatmap parameters
@@ -428,5 +429,5 @@
         // set hints for the render
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-            Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false) ?
+            Config.getPref().getBoolean("mappaint.gpx.use-antialiasing", false) ?
                     RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java	(revision 12846)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
 import org.openstreetmap.josm.io.audio.AudioUtil;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
@@ -138,5 +139,5 @@
         boolean timedMarkersOmitted = false;
         boolean untimedMarkersOmitted = false;
-        double snapDistance = Main.pref.getDouble("marker.audiofromuntimedwaypoints.distance", 1.0e-3);
+        double snapDistance = Config.getPref().getDouble("marker.audiofromuntimedwaypoints.distance", 1.0e-3);
         // about 25 m
         WayPoint wayPointFromTimeStamp = null;
@@ -171,5 +172,5 @@
 
         // (a) try explicit timestamped waypoints - unless suppressed
-        if (hasWaypoints && Main.pref.getBoolean("marker.audiofromexplicitwaypoints", true)) {
+        if (hasWaypoints && Config.getPref().getBoolean("marker.audiofromexplicitwaypoints", true)) {
             for (WayPoint w : layer.data.waypoints) {
                 if (w.time > firstTime) {
@@ -182,5 +183,5 @@
 
         // (b) try explicit waypoints without timestamps - unless suppressed
-        if (hasWaypoints && Main.pref.getBoolean("marker.audiofromuntimedwaypoints", true)) {
+        if (hasWaypoints && Config.getPref().getBoolean("marker.audiofromuntimedwaypoints", true)) {
             for (WayPoint w : layer.data.waypoints) {
                 if (waypoints.contains(w)) {
@@ -202,5 +203,5 @@
 
         // (c) use explicitly named track points, again unless suppressed
-        if (layer.data.tracks != null && Main.pref.getBoolean("marker.audiofromnamedtrackpoints", false)
+        if (layer.data.tracks != null && Config.getPref().getBoolean("marker.audiofromnamedtrackpoints", false)
                 && !layer.data.tracks.isEmpty()) {
             for (GpxTrack track : layer.data.tracks) {
@@ -216,10 +217,10 @@
 
         // (d) use timestamp of file as location on track
-        if (hasTracks && Main.pref.getBoolean("marker.audiofromwavtimestamps", false)) {
+        if (hasTracks && Config.getPref().getBoolean("marker.audiofromwavtimestamps", false)) {
             double lastModified = audioFile.lastModified() / 1000.0; // lastModified is in milliseconds
             double duration = AudioUtil.getCalibratedDuration(audioFile);
             double startTime = lastModified - duration;
             startTime = firstStartTime + (startTime - firstStartTime)
-                    / Main.pref.getDouble("audio.calibration", 1.0 /* default, ratio */);
+                    / Config.getPref().getDouble("audio.calibration", 1.0 /* default, ratio */);
             WayPoint w1 = null;
             WayPoint w2 = null;
@@ -259,5 +260,5 @@
 
         // (f) simply add a single marker at the start of the track
-        if ((Main.pref.getBoolean("marker.audiofromstart") || waypoints.isEmpty()) && hasTracks) {
+        if ((Config.getPref().getBoolean("marker.audiofromstart") || waypoints.isEmpty()) && hasTracks) {
             boolean gotOne = false;
             for (GpxTrack track : layer.data.tracks) {
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportImagesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportImagesAction.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportImagesAction.java	(revision 12846)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
 import org.openstreetmap.josm.gui.widgets.FileChooserManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
@@ -68,5 +69,5 @@
         }
         JpgImporter importer = new JpgImporter(layer);
-        AbstractFileChooser fc = new FileChooserManager(true, "geoimage.lastdirectory", Main.pref.get("lastDirectory")).
+        AbstractFileChooser fc = new FileChooserManager(true, "geoimage.lastdirectory", Config.getPref().get("lastDirectory")).
                 createFileChooser(true, null, importer.filter, JFileChooser.FILES_AND_DIRECTORIES).openFileChooser();
         if (fc != null) {
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/ReprojectionTile.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/ReprojectionTile.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/ReprojectionTile.java	(revision 12846)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageWarp;
 import org.openstreetmap.josm.tools.Utils;
@@ -113,5 +114,5 @@
         double scaleMapView = MainApplication.getMap().mapView.getScale();
         ImageWarp.Interpolation interpolation;
-        switch (Main.pref.get("imagery.warp.pixel-interpolation", "bilinear")) {
+        switch (Config.getPref().get("imagery.warp.pixel-interpolation", "bilinear")) {
             case "nearest_neighbor":
                 interpolation = ImageWarp.Interpolation.NEAREST_NEIGHBOR;
@@ -159,5 +160,5 @@
 
         ImageWarp.PointTransform transform;
-        int stride = Main.pref.getInt("imagery.warp.projection-interpolation.stride", 7);
+        int stride = Config.getPref().getInt("imagery.warp.projection-interpolation.stride", 7);
         if (stride > 0) {
             transform = new ImageWarp.GridTransform(pointTransform, stride);
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java	(revision 12846)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.io.session.SessionAwareReadApply;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -101,6 +102,6 @@
         for (String p : prefixes) {
             String key = p + "." + name;
-            boolean currentValue = Main.pref.getBoolean(key, true);
-            if (!Main.pref.get(key).isEmpty()) {
+            boolean currentValue = Config.getPref().getBoolean(key, true);
+            if (!Config.getPref().get(key).isEmpty()) {
                 value = currentValue;
             }
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java	(revision 12846)
@@ -11,8 +11,8 @@
 import javax.swing.border.Border;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 
@@ -67,5 +67,5 @@
 
         String labelText = getText();
-        if (labelText != null && Main.pref.getBoolean("marker.buttonlabels", true)) {
+        if (labelText != null && Config.getPref().getBoolean("marker.buttonlabels", true)) {
             g.drawString(labelText, screen.x+4, screen.y+2);
         }
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 12846)
@@ -51,4 +51,5 @@
 import org.openstreetmap.josm.gui.layer.gpx.ConvertToDataLayerAction;
 import org.openstreetmap.josm.io.audio.AudioPlayer;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -230,5 +231,5 @@
         components.add(SeparatorLayerAction.INSTANCE);
         components.add(new SynchronizeAudio());
-        if (Main.pref.getBoolean("marker.traceaudio", true)) {
+        if (Config.getPref().getBoolean("marker.traceaudio", true)) {
             components.add(new MoveAudio());
         }
@@ -439,5 +440,5 @@
      */
     private boolean isTextOrIconShown() {
-        String current = Main.pref.get("marker.show "+getName(), "show");
+        String current = Config.getPref().get("marker.show "+getName(), "show");
         return "show".equalsIgnoreCase(current);
     }
@@ -491,5 +492,5 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            Main.pref.put("marker.show "+layer.getName(), layer.isTextOrIconShown() ? "hide" : "show");
+            Config.getPref().put("marker.show "+layer.getName(), layer.isTextOrIconShown() ? "hide" : "show");
             layer.invalidate();
         }
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java	(revision 12846)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.io.audio.AudioPlayer;
 import org.openstreetmap.josm.io.audio.AudioUtil;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -60,9 +61,9 @@
     private PlayHeadMarker() {
         super(LatLon.ZERO, "",
-                Main.pref.get("marker.audiotracericon", "audio-tracer"),
+                Config.getPref().get("marker.audiotracericon", "audio-tracer"),
                 null, -1.0, 0.0);
-        enabled = Main.pref.getBoolean("marker.traceaudio", true);
+        enabled = Config.getPref().getBoolean("marker.traceaudio", true);
         if (!enabled) return;
-        dropTolerance = Main.pref.getInt("marker.playHeadDropTolerance", 50);
+        dropTolerance = Config.getPref().getInt("marker.playHeadDropTolerance", 50);
         if (MainApplication.isDisplayingMapView()) {
             MapFrame map = MainApplication.getMap();
@@ -294,5 +295,5 @@
         jumpToMarker = true;
         if (timer == null) {
-            animationInterval = Main.pref.getDouble("marker.audioanimationinterval", 1.0); //milliseconds
+            animationInterval = Config.getPref().getDouble("marker.audioanimationinterval", 1.0); //milliseconds
             timer = new Timer((int) (animationInterval * 1000.0), e -> timerAction());
             timer.setInitialDelay(0);
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 12846)
@@ -11,5 +11,4 @@
 import java.util.Map.Entry;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
@@ -33,4 +32,5 @@
 import org.openstreetmap.josm.gui.mappaint.styleelement.TextLabel;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Utils;
@@ -74,5 +74,5 @@
     public ElemStyles() {
         styleSources = new ArrayList<>();
-        Main.pref.addPreferenceChangeListener(this);
+        Config.getPref().addPreferenceChangeListener(this);
     }
 
@@ -517,5 +517,5 @@
      * Determines whether primitive has area-type {@link StyleElement}s, but
      * no line-type StyleElements.
-     * 
+     *
      * {@link TextElement} is ignored, as it can be both line and area-type.
      * @param p the OSM primitive
@@ -551,5 +551,5 @@
      *
      * In addition, it adds an intermediate cache for the preference values,
-     * as frequent preference lookup (using <code>Main.pref.get()</code>) for
+     * as frequent preference lookup (using <code>Config.getPref().get()</code>) for
      * each primitive can be slow during rendering.
      *
@@ -564,5 +564,5 @@
             res = preferenceCache.get(key);
         } else {
-            res = Main.pref.get(key, null);
+            res = Config.getPref().get(key, null);
             preferenceCache.put(key, res);
         }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 12846)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
 import org.openstreetmap.josm.io.CachedFile;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ListenerList;
@@ -256,5 +257,5 @@
         }
 
-        Collection<String> prefIconDirs = Main.pref.getList("mappaint.icon.sources");
+        Collection<String> prefIconDirs = Config.getPref().getList("mappaint.icon.sources");
         for (String fileset : prefIconDirs) {
             String[] a;
@@ -271,5 +272,5 @@
         }
 
-        if (Main.pref.getBoolean("mappaint.icon.enable-defaults", true)) {
+        if (Config.getPref().getBoolean("mappaint.icon.enable-defaults", true)) {
             /* don't prefix icon path, as it should be generic */
             dirs.add("resource://images/");
@@ -299,5 +300,5 @@
         final long startTime = System.currentTimeMillis();
         source.loadStyleSource();
-        if (Main.pref.getBoolean("mappaint.auto_reload_local_styles", true) && source.isLocal()) {
+        if (Config.getPref().getBoolean("mappaint.auto_reload_local_styles", true) && source.isLocal()) {
             try {
                 Main.fileWatcher.registerSource(source);
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java	(revision 12846)
@@ -2,5 +2,5 @@
 package org.openstreetmap.josm.gui.mappaint;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -66,5 +66,5 @@
         @Override
         public Object getValue() {
-            String val = Main.pref.get(prefKey, null);
+            String val = Config.getPref().get(prefKey, null);
             if (val == null) return def;
             return Boolean.valueOf(val);
@@ -77,7 +77,7 @@
             boolean b = (Boolean) o;
             if (b == def) {
-                Main.pref.put(prefKey, null);
+                Config.getPref().put(prefKey, null);
             } else {
-                Main.pref.putBoolean(prefKey, b);
+                Config.getPref().putBoolean(prefKey, b);
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 12846)
@@ -28,7 +28,7 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler.Match;
+import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.gui.mappaint.Cascade;
 import org.openstreetmap.josm.gui.mappaint.Environment;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 12846)
@@ -32,9 +32,9 @@
 import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.AbstractPrimitive.KeyValueVisitor;
-import org.openstreetmap.josm.data.preferences.sources.SourceEntry;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.preferences.sources.SourceEntry;
 import org.openstreetmap.josm.gui.mappaint.Cascade;
 import org.openstreetmap.josm.gui.mappaint.Environment;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 12846)
@@ -7,5 +7,4 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -17,4 +16,5 @@
 import org.openstreetmap.josm.gui.mappaint.Environment;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.HiDPISupport;
@@ -90,5 +90,5 @@
             );
 
-            fillImage.alpha = Utils.clamp(Main.pref.getInt("mappaint.fill-image-alpha", 255), 0, 255);
+            fillImage.alpha = Utils.clamp(Config.getPref().getInt("mappaint.fill-image-alpha", 255), 0, 255);
             Integer pAlpha = Utils.colorFloat2int(c.get(FILL_OPACITY, null, float.class));
             if (pAlpha != null) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java	(revision 12846)
@@ -12,4 +12,5 @@
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.LanguageInfo;
 
@@ -233,13 +234,13 @@
          */
         public final void initNameTagsFromPreferences() {
-            if (Main.pref == null) {
+            if (Config.getPref() == null) {
                 this.nameTags = new ArrayList<>(Arrays.asList(DEFAULT_NAME_TAGS));
                 this.nameComplementTags = new ArrayList<>(Arrays.asList(DEFAULT_NAME_COMPLEMENT_TAGS));
             } else {
                 this.nameTags = new ArrayList<>(
-                        Main.pref.getList("mappaint.nameOrder", Arrays.asList(DEFAULT_NAME_TAGS))
+                        Config.getPref().getList("mappaint.nameOrder", Arrays.asList(DEFAULT_NAME_TAGS))
                 );
                 this.nameComplementTags = new ArrayList<>(
-                        Main.pref.getList("mappaint.nameComplementOrder", Arrays.asList(DEFAULT_NAME_COMPLEMENT_TAGS))
+                        Config.getPref().getList("mappaint.nameComplementOrder", Arrays.asList(DEFAULT_NAME_COMPLEMENT_TAGS))
                 );
             }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 12846)
@@ -10,5 +10,4 @@
 import java.util.stream.IntStream;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -25,4 +24,5 @@
 import org.openstreetmap.josm.gui.mappaint.styleelement.BoxTextElement.BoxProvider;
 import org.openstreetmap.josm.gui.mappaint.styleelement.BoxTextElement.SimpleBoxProvider;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -196,5 +196,5 @@
         mapImage.offsetY = Math.round(offsetYF);
 
-        mapImage.alpha = Utils.clamp(Main.pref.getInt("mappaint.icon-image-alpha", 255), 0, 255);
+        mapImage.alpha = Utils.clamp(Config.getPref().getInt("mappaint.icon-image-alpha", 255), 0, 255);
         Integer pAlpha = Utils.colorFloat2int(c.get(keys[ICON_OPACITY_IDX], null, float.class));
         if (pAlpha != null) {
@@ -356,9 +356,8 @@
             // This is only executed once, so no performance concerns.
             // However, it would be better, if the settings could be changed at runtime.
-            int size = max(
-                    Main.pref.getInt("mappaint.node.selected-size", 5),
-                    Main.pref.getInt("mappaint.node.unselected-size", 3),
-                    Main.pref.getInt("mappaint.node.connection-size", 5),
-                    Main.pref.getInt("mappaint.node.tagged-size", 3)
+            int size = max(Config.getPref().getInt("mappaint.node.selected-size", 5),
+                    Config.getPref().getInt("mappaint.node.unselected-size", 3),
+                    Config.getPref().getInt("mappaint.node.connection-size", 5),
+                    Config.getPref().getInt("mappaint.node.tagged-size", 3)
             );
             return new SimpleBoxProvider(new Rectangle(-size/2, -size/2, size, size));
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java	(revision 12846)
@@ -7,5 +7,4 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
@@ -15,4 +14,5 @@
 import org.openstreetmap.josm.gui.mappaint.StyleKeys;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction.RelativeFloat;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -148,5 +148,5 @@
                 s = defaultFontSize;
                 if (s == null) {
-                    defaultFontSize = s = (float) Main.pref.getInt("mappaint.fontsize", 8);
+                    defaultFontSize = s = (float) Config.getPref().getInt("mappaint.fontsize", 8);
                 }
             }
@@ -161,5 +161,5 @@
                 n = defaultFontName;
                 if (n == null) {
-                    defaultFontName = n = Main.pref.get("mappaint.font", "Droid Sans");
+                    defaultFontName = n = Config.getPref().get("mappaint.font", "Droid Sans");
                 }
             }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 12846)
@@ -93,4 +93,5 @@
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageOverlay;
@@ -423,8 +424,8 @@
 
             if (!iconPaths.isEmpty()) {
-                if (Main.pref.putList(iconPref, iconPaths)) {
+                if (Config.getPref().putList(iconPref, iconPaths)) {
                     changed = true;
                 }
-            } else if (Main.pref.putList(iconPref, null)) {
+            } else if (Config.getPref().putList(iconPref, null)) {
                 changed = true;
             }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 12846)
@@ -71,4 +71,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 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.ImageProvider;
@@ -488,5 +489,5 @@
         private void setActionAndAdapt(ActionDefinition action) {
             this.act = action;
-            doNotHide.setSelected(Main.pref.getBoolean("toolbar.always-visible", true));
+            doNotHide.setSelected(Config.getPref().getBoolean("toolbar.always-visible", true));
             remove.setVisible(act != null);
             shortcutEdit.setVisible(act != null);
@@ -502,5 +503,5 @@
                 // remove the button from toolbar preferences
                 t.remove(res);
-                Main.pref.putList("toolbar", t);
+                Config.getPref().putList("toolbar", t);
                 MainApplication.getToolbar().refreshToolbarControl();
             }
@@ -532,6 +533,6 @@
             public void actionPerformed(ActionEvent e) {
                 boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
-                Main.pref.putBoolean("toolbar.always-visible", sel);
-                Main.pref.putBoolean("menu.always-visible", sel);
+                Config.getPref().putBoolean("toolbar.always-visible", sel);
+                Config.getPref().putBoolean("menu.always-visible", sel);
             }
         });
@@ -987,5 +988,5 @@
                 t = Collections.singletonList(EMPTY_TOOLBAR_MARKER);
             }
-            Main.pref.putList("toolbar", t);
+            Config.getPref().putList("toolbar", t);
             MainApplication.getToolbar().refreshToolbarControl();
             return false;
@@ -1002,5 +1003,5 @@
             control.setComponentPopupMenu(popupMenu);
         });
-        Main.pref.addPreferenceChangeListener(e -> {
+        Config.getPref().addPreferenceChangeListener(e -> {
             if ("toolbar.visible".equals(e.getKey())) {
                 refreshToolbarControl();
@@ -1074,5 +1075,5 @@
     public static Collection<String> getToolString() {
 
-        Collection<String> toolStr = Main.pref.getList("toolbar", Arrays.asList(deftoolbar));
+        Collection<String> toolStr = Config.getPref().getList("toolbar", Arrays.asList(deftoolbar));
         if (toolStr == null || toolStr.isEmpty()) {
             toolStr = Arrays.asList(deftoolbar);
@@ -1188,5 +1189,5 @@
         }
 
-        boolean visible = Main.pref.getBoolean("toolbar.visible", true);
+        boolean visible = Config.getPref().getBoolean("toolbar.visible", true);
 
         control.setFocusTraversalKeysEnabled(!unregisterTab);
@@ -1214,5 +1215,5 @@
             }
         }
-        Main.pref.putList("toolbar", t);
+        Config.getPref().putList("toolbar", t);
         MainApplication.getToolbar().refreshToolbarControl();
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java	(revision 12846)
@@ -11,5 +11,4 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
@@ -18,4 +17,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -60,10 +60,10 @@
 
         // audioMenuVisible
-        audioMenuVisible.setSelected(!Main.pref.getBoolean("audio.menuinvisible"));
+        audioMenuVisible.setSelected(!Config.getPref().getBoolean("audio.menuinvisible"));
         audioMenuVisible.setToolTipText(tr("Show or hide the audio menu entry on the main menu bar."));
         audio.add(audioMenuVisible, GBC.eol().insets(0, 0, 0, 0));
 
         // audioTraceVisible
-        markerAudioTraceVisible.setSelected(Main.pref.getBoolean("marker.traceaudio", true));
+        markerAudioTraceVisible.setSelected(Config.getPref().getBoolean("marker.traceaudio", true));
         markerAudioTraceVisible.setToolTipText(
                 tr("Display a moving icon representing the point on the synchronized track where the audio currently playing was recorded."));
@@ -71,5 +71,5 @@
 
         // buttonLabels
-        markerButtonLabels.setSelected(Main.pref.getBoolean("marker.buttonlabels", true));
+        markerButtonLabels.setSelected(Config.getPref().getBoolean("marker.buttonlabels", true));
         markerButtonLabels.setToolTipText(tr("Put text labels against audio (and image and web) markers as well as their button icons."));
         audio.add(markerButtonLabels, GBC.eol().insets(0, 0, 0, 0));
@@ -78,15 +78,15 @@
 
         // audioMarkersFromExplicitWaypoints
-        audioMarkersFromExplicitWaypoints.setSelected(Main.pref.getBoolean("marker.audiofromexplicitwaypoints", true));
+        audioMarkersFromExplicitWaypoints.setSelected(Config.getPref().getBoolean("marker.audiofromexplicitwaypoints", true));
         audioMarkersFromExplicitWaypoints.setToolTipText(tr("When importing audio, apply it to any waypoints in the GPX layer."));
         audio.add(audioMarkersFromExplicitWaypoints, GBC.eol().insets(10, 0, 0, 0));
 
         // audioMarkersFromUntimedWaypoints
-        audioMarkersFromUntimedWaypoints.setSelected(Main.pref.getBoolean("marker.audiofromuntimedwaypoints", true));
+        audioMarkersFromUntimedWaypoints.setSelected(Config.getPref().getBoolean("marker.audiofromuntimedwaypoints", true));
         audioMarkersFromUntimedWaypoints.setToolTipText(tr("When importing audio, apply it to any waypoints in the GPX layer."));
         audio.add(audioMarkersFromUntimedWaypoints, GBC.eol().insets(10, 0, 0, 0));
 
         // audioMarkersFromNamedTrackpoints
-        audioMarkersFromNamedTrackpoints.setSelected(Main.pref.getBoolean("marker.audiofromnamedtrackpoints", false));
+        audioMarkersFromNamedTrackpoints.setSelected(Config.getPref().getBoolean("marker.audiofromnamedtrackpoints", false));
         audioMarkersFromNamedTrackpoints.setToolTipText(
                 tr("Automatically create audio markers from trackpoints (rather than explicit waypoints) with names or descriptions."));
@@ -94,5 +94,5 @@
 
         // audioMarkersFromWavTimestamps
-        audioMarkersFromWavTimestamps.setSelected(Main.pref.getBoolean("marker.audiofromwavtimestamps", false));
+        audioMarkersFromWavTimestamps.setSelected(Config.getPref().getBoolean("marker.audiofromwavtimestamps", false));
         audioMarkersFromWavTimestamps.setToolTipText(
                 tr("Create audio markers at the position on the track corresponding to the modified time of each audio WAV file imported."));
@@ -100,20 +100,20 @@
 
         // audioMarkersFromStart
-        audioMarkersFromStart.setSelected(Main.pref.getBoolean("marker.audiofromstart"));
+        audioMarkersFromStart.setSelected(Config.getPref().getBoolean("marker.audiofromstart"));
         audioMarkersFromStart.setToolTipText(
                 tr("Automatically create audio markers from trackpoints (rather than explicit waypoints) with names or descriptions."));
         audio.add(audioMarkersFromStart, GBC.eol().insets(10, 0, 0, 0));
 
-        audioForwardBackAmount.setText(Main.pref.get("audio.forwardbackamount", "10.0"));
+        audioForwardBackAmount.setText(Config.getPref().get("audio.forwardbackamount", "10.0"));
         audioForwardBackAmount.setToolTipText(tr("The number of seconds to jump forward or back when the relevant button is pressed"));
         audio.add(new JLabel(tr("Forward/back time (seconds)")), GBC.std());
         audio.add(audioForwardBackAmount, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 0, 0, 5));
 
-        audioFastForwardMultiplier.setText(Main.pref.get("audio.fastfwdmultiplier", "1.3"));
+        audioFastForwardMultiplier.setText(Config.getPref().get("audio.fastfwdmultiplier", "1.3"));
         audioFastForwardMultiplier.setToolTipText(tr("The amount by which the speed is multiplied for fast forwarding"));
         audio.add(new JLabel(tr("Fast forward multiplier")), GBC.std());
         audio.add(audioFastForwardMultiplier, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 0, 0, 5));
 
-        audioLeadIn.setText(Main.pref.get("audio.leadin", "1.0"));
+        audioLeadIn.setText(Config.getPref().get("audio.leadin", "1.0"));
         audioLeadIn.setToolTipText(
                 tr("Playback starts this number of seconds before (or after, if negative) the audio track position requested"));
@@ -121,5 +121,5 @@
         audio.add(audioLeadIn, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 0, 0, 5));
 
-        audioCalibration.setText(Main.pref.get("audio.calibration", "1.0"));
+        audioCalibration.setText(Config.getPref().get("audio.calibration", "1.0"));
         audioCalibration.setToolTipText(tr("The ratio of voice recorder elapsed time to true elapsed time"));
         audio.add(new JLabel(tr("Voice recorder calibration")), GBC.std());
@@ -133,16 +133,16 @@
     @Override
     public boolean ok() {
-        Main.pref.putBoolean("audio.menuinvisible", !audioMenuVisible.isSelected());
-        Main.pref.putBoolean("marker.traceaudio", markerAudioTraceVisible.isSelected());
-        Main.pref.putBoolean("marker.buttonlabels", markerButtonLabels.isSelected());
-        Main.pref.putBoolean("marker.audiofromexplicitwaypoints", audioMarkersFromExplicitWaypoints.isSelected());
-        Main.pref.putBoolean("marker.audiofromuntimedwaypoints", audioMarkersFromUntimedWaypoints.isSelected());
-        Main.pref.putBoolean("marker.audiofromnamedtrackpoints", audioMarkersFromNamedTrackpoints.isSelected());
-        Main.pref.putBoolean("marker.audiofromwavtimestamps", audioMarkersFromWavTimestamps.isSelected());
-        Main.pref.putBoolean("marker.audiofromstart", audioMarkersFromStart.isSelected());
-        Main.pref.put("audio.forwardbackamount", audioForwardBackAmount.getText());
-        Main.pref.put("audio.fastfwdmultiplier", audioFastForwardMultiplier.getText());
-        Main.pref.put("audio.leadin", audioLeadIn.getText());
-        Main.pref.put("audio.calibration", audioCalibration.getText());
+        Config.getPref().putBoolean("audio.menuinvisible", !audioMenuVisible.isSelected());
+        Config.getPref().putBoolean("marker.traceaudio", markerAudioTraceVisible.isSelected());
+        Config.getPref().putBoolean("marker.buttonlabels", markerButtonLabels.isSelected());
+        Config.getPref().putBoolean("marker.audiofromexplicitwaypoints", audioMarkersFromExplicitWaypoints.isSelected());
+        Config.getPref().putBoolean("marker.audiofromuntimedwaypoints", audioMarkersFromUntimedWaypoints.isSelected());
+        Config.getPref().putBoolean("marker.audiofromnamedtrackpoints", audioMarkersFromNamedTrackpoints.isSelected());
+        Config.getPref().putBoolean("marker.audiofromwavtimestamps", audioMarkersFromWavTimestamps.isSelected());
+        Config.getPref().putBoolean("marker.audiofromstart", audioMarkersFromStart.isSelected());
+        Config.getPref().put("audio.forwardbackamount", audioForwardBackAmount.getText());
+        Config.getPref().put("audio.fastfwdmultiplier", audioFastForwardMultiplier.getText());
+        Config.getPref().put("audio.leadin", audioLeadIn.getText());
+        Config.getPref().put("audio.calibration", audioCalibration.getText());
         return false;
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java	(revision 12846)
@@ -46,4 +46,5 @@
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
@@ -272,5 +273,5 @@
         boolean ret = false;
         for (String d : del) {
-            Main.pref.put("color."+d, null);
+            Config.getPref().put("color."+d, null);
         }
         for (int i = 0; i < colors.getRowCount(); ++i) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java	(revision 12846)
@@ -13,5 +13,4 @@
 import javax.swing.JScrollPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.gui.autofilter.AutoFilterManager;
@@ -24,4 +23,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -79,5 +79,5 @@
         directionHint.addActionListener(e -> {
             if (directionHint.isSelected()) {
-                headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
+                headArrow.setSelected(Config.getPref().getBoolean("draw.segment.head_only", false));
             } else {
                 headArrow.setSelected(false);
@@ -86,55 +86,55 @@
         });
         directionHint.setToolTipText(tr("Draw direction hints for way segments."));
-        directionHint.setSelected(Main.pref.getBoolean("draw.segment.direction", false));
+        directionHint.setSelected(Config.getPref().getBoolean("draw.segment.direction", false));
 
         // only on the head of a way
         headArrow.setToolTipText(tr("Only on the head of a way."));
-        headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
+        headArrow.setSelected(Config.getPref().getBoolean("draw.segment.head_only", false));
         headArrow.setEnabled(directionHint.isSelected());
 
         // draw oneway arrows
         onewayArrow.setToolTipText(tr("Draw arrows in the direction of oneways and other directed features."));
-        onewayArrow.setSelected(Main.pref.getBoolean("draw.oneway", true));
+        onewayArrow.setSelected(Config.getPref().getBoolean("draw.oneway", true));
 
         // segment order number
         segmentOrderNumber.setToolTipText(tr("Draw the order numbers of all segments within their way."));
-        segmentOrderNumber.setSelected(Main.pref.getBoolean("draw.segment.order_number", false));
+        segmentOrderNumber.setSelected(Config.getPref().getBoolean("draw.segment.order_number", false));
         segmentOrderNumberOnSelectedWay.setToolTipText(tr("Draw the order numbers of all segments within their way."));
-        segmentOrderNumberOnSelectedWay.setSelected(Main.pref.getBoolean("draw.segment.order_number.on_selected", false));
+        segmentOrderNumberOnSelectedWay.setSelected(Config.getPref().getBoolean("draw.segment.order_number.on_selected", false));
 
         // downloaded area
         sourceBounds.setToolTipText(tr("Draw the boundaries of data loaded from the server."));
-        sourceBounds.setSelected(Main.pref.getBoolean("draw.data.downloaded_area", true));
+        sourceBounds.setSelected(Config.getPref().getBoolean("draw.data.downloaded_area", true));
 
         // virtual nodes
         virtualNodes.setToolTipText(tr("Draw virtual nodes in select mode for easy way modification."));
-        virtualNodes.setSelected(Main.pref.getInt("mappaint.node.virtual-size", 8) != 0);
+        virtualNodes.setSelected(Config.getPref().getInt("mappaint.node.virtual-size", 8) != 0);
 
         // background layers in inactive color
         inactive.setToolTipText(tr("Draw the inactive data layers in a different color."));
-        inactive.setSelected(Main.pref.getBoolean("draw.data.inactive_color", true));
+        inactive.setSelected(Config.getPref().getBoolean("draw.data.inactive_color", true));
 
         // antialiasing
         useAntialiasing.setToolTipText(tr("Apply antialiasing to the map view resulting in a smoother appearance."));
-        useAntialiasing.setSelected(Main.pref.getBoolean("mappaint.use-antialiasing", true));
+        useAntialiasing.setSelected(Config.getPref().getBoolean("mappaint.use-antialiasing", true));
 
         // wireframe mode antialiasing
         useWireframeAntialiasing.setToolTipText(tr("Apply antialiasing to the map view in wireframe mode resulting in a smoother appearance."));
-        useWireframeAntialiasing.setSelected(Main.pref.getBoolean("mappaint.wireframe.use-antialiasing", false));
+        useWireframeAntialiasing.setSelected(Config.getPref().getBoolean("mappaint.wireframe.use-antialiasing", false));
 
         // highlighting
         useHighlighting.setToolTipText(tr("Hightlight target nodes and ways while drawing or selecting"));
-        useHighlighting.setSelected(Main.pref.getBoolean("draw.target-highlight", true));
+        useHighlighting.setSelected(Config.getPref().getBoolean("draw.target-highlight", true));
 
         drawHelperLine.setToolTipText(tr("Draw rubber-band helper line"));
-        drawHelperLine.setSelected(Main.pref.getBoolean("draw.helper-line", true));
+        drawHelperLine.setSelected(Config.getPref().getBoolean("draw.helper-line", true));
 
         // outlineOnly
         outlineOnly.setToolTipText(tr("This option suppresses the filling of areas, overriding anything specified in the selected style."));
-        outlineOnly.setSelected(Main.pref.getBoolean("draw.data.area_outline_only", false));
+        outlineOnly.setSelected(Config.getPref().getBoolean("draw.data.area_outline_only", false));
 
         // discardable keys
         discardableKeys.setToolTipText(tr("Display keys which have been deemed uninteresting to the point that they can be silently removed."));
-        discardableKeys.setSelected(Main.pref.getBoolean("display.discardable-keys", false));
+        discardableKeys.setSelected(Config.getPref().getBoolean("display.discardable-keys", false));
 
         // auto filters
@@ -195,20 +195,20 @@
     public boolean ok() {
         boolean restart = gpxPanel.savePreferences();
-        Main.pref.putBoolean("draw.data.area_outline_only", outlineOnly.isSelected());
-        Main.pref.putBoolean("draw.segment.direction", directionHint.isSelected());
-        Main.pref.putBoolean("draw.segment.head_only", headArrow.isSelected());
-        Main.pref.putBoolean("draw.oneway", onewayArrow.isSelected());
-        Main.pref.putBoolean("draw.segment.order_number", segmentOrderNumber.isSelected());
-        Main.pref.putBoolean("draw.segment.order_number.on_selected", segmentOrderNumberOnSelectedWay.isSelected());
-        Main.pref.putBoolean("draw.data.downloaded_area", sourceBounds.isSelected());
-        Main.pref.putBoolean("draw.data.inactive_color", inactive.isSelected());
-        Main.pref.putBoolean("mappaint.use-antialiasing", useAntialiasing.isSelected());
-        Main.pref.putBoolean("mappaint.wireframe.use-antialiasing", useWireframeAntialiasing.isSelected());
-        Main.pref.putBoolean("draw.target-highlight", useHighlighting.isSelected());
-        Main.pref.putBoolean("draw.helper-line", drawHelperLine.isSelected());
-        Main.pref.putBoolean("display.discardable-keys", discardableKeys.isSelected());
+        Config.getPref().putBoolean("draw.data.area_outline_only", outlineOnly.isSelected());
+        Config.getPref().putBoolean("draw.segment.direction", directionHint.isSelected());
+        Config.getPref().putBoolean("draw.segment.head_only", headArrow.isSelected());
+        Config.getPref().putBoolean("draw.oneway", onewayArrow.isSelected());
+        Config.getPref().putBoolean("draw.segment.order_number", segmentOrderNumber.isSelected());
+        Config.getPref().putBoolean("draw.segment.order_number.on_selected", segmentOrderNumberOnSelectedWay.isSelected());
+        Config.getPref().putBoolean("draw.data.downloaded_area", sourceBounds.isSelected());
+        Config.getPref().putBoolean("draw.data.inactive_color", inactive.isSelected());
+        Config.getPref().putBoolean("mappaint.use-antialiasing", useAntialiasing.isSelected());
+        Config.getPref().putBoolean("mappaint.wireframe.use-antialiasing", useWireframeAntialiasing.isSelected());
+        Config.getPref().putBoolean("draw.target-highlight", useHighlighting.isSelected());
+        Config.getPref().putBoolean("draw.helper-line", drawHelperLine.isSelected());
+        Config.getPref().putBoolean("display.discardable-keys", discardableKeys.isSelected());
         AutoFilterManager.PROP_AUTO_FILTER_ENABLED.put(autoFilters.isSelected());
         AutoFilterManager.PROP_AUTO_FILTER_RULE.put(((AutoFilterRule) autoFilterRules.getSelectedItem()).getKey());
-        int vn = Main.pref.getInt("mappaint.node.virtual-size", 8);
+        int vn = Config.getPref().getInt("mappaint.node.virtual-size", 8);
         if (virtualNodes.isSelected()) {
             if (vn < 1) {
@@ -218,5 +218,5 @@
             vn = 0;
         }
-        Main.pref.putInt("mappaint.node.virtual-size", vn);
+        Config.getPref().putInt("mappaint.node.virtual-size", vn);
         return restart;
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java	(revision 12846)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -385,7 +386,7 @@
      */
     public final void loadPreferences() {
-        makeAutoMarkers.setSelected(Main.pref.getBoolean("marker.makeautomarkers", true));
-        if (layerName != null && Main.pref.get("draw.rawgps.lines."+layerName).isEmpty()
-                && Main.pref.get("draw.rawgps.lines.local."+layerName).isEmpty()) {
+        makeAutoMarkers.setSelected(Config.getPref().getBoolean("marker.makeautomarkers", true));
+        if (layerName != null && Config.getPref().get("draw.rawgps.lines."+layerName).isEmpty()
+                && Config.getPref().get("draw.rawgps.lines.local."+layerName).isEmpty()) {
             // no line preferences for layer is found
             drawRawGpsLinesGlobal.setSelected(true);
@@ -411,9 +412,9 @@
         hdopCircleGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.hdopcircle", layerName, false));
         largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large", layerName, false));
-        useGpsAntialiasing.setSelected(Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false));
+        useGpsAntialiasing.setSelected(Config.getPref().getBoolean("mappaint.gpx.use-antialiasing", false));
 
         drawRawGpsLinesActionListener.actionPerformed(null);
 
-        if (layerName != null && Main.pref.get("draw.rawgps.colors."+layerName).isEmpty()) {
+        if (layerName != null && Config.getPref().get("draw.rawgps.colors."+layerName).isEmpty()) {
             colorTypeGlobal.setSelected(true);
             colorDynamic.setSelected(false);
@@ -454,37 +455,37 @@
             layerNameDot = "";
         }
-        Main.pref.putBoolean("marker.makeautomarkers"+layerNameDot, makeAutoMarkers.isSelected());
+        Config.getPref().putBoolean("marker.makeautomarkers"+layerNameDot, makeAutoMarkers.isSelected());
         if (drawRawGpsLinesGlobal.isSelected()) {
-            Main.pref.put("draw.rawgps.lines" + layerNameDot, null);
-            Main.pref.put("draw.rawgps.max-line-length" + layerNameDot, null);
-            Main.pref.put("draw.rawgps.lines.local" + layerNameDot, null);
-            Main.pref.put("draw.rawgps.max-line-length.local" + layerNameDot, null);
-            Main.pref.put("draw.rawgps.lines.force"+layerNameDot, null);
-            Main.pref.put("draw.rawgps.direction"+layerNameDot, null);
-            Main.pref.put("draw.rawgps.alternatedirection"+layerNameDot, null);
-            Main.pref.put("draw.rawgps.min-arrow-distance"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.lines" + layerNameDot, null);
+            Config.getPref().put("draw.rawgps.max-line-length" + layerNameDot, null);
+            Config.getPref().put("draw.rawgps.lines.local" + layerNameDot, null);
+            Config.getPref().put("draw.rawgps.max-line-length.local" + layerNameDot, null);
+            Config.getPref().put("draw.rawgps.lines.force"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.direction"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.alternatedirection"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.min-arrow-distance"+layerNameDot, null);
         } else {
             if (layerName == null || !locLayer) {
-                Main.pref.putBoolean("draw.rawgps.lines" + layerNameDot, drawRawGpsLinesAll.isSelected());
-                Main.pref.put("draw.rawgps.max-line-length" + layerNameDot, drawRawGpsMaxLineLength.getText());
+                Config.getPref().putBoolean("draw.rawgps.lines" + layerNameDot, drawRawGpsLinesAll.isSelected());
+                Config.getPref().put("draw.rawgps.max-line-length" + layerNameDot, drawRawGpsMaxLineLength.getText());
             }
             if (layerName == null || locLayer) {
-                Main.pref.putBoolean("draw.rawgps.lines.local" + layerNameDot,
+                Config.getPref().putBoolean("draw.rawgps.lines.local" + layerNameDot,
                         drawRawGpsLinesAll.isSelected() || drawRawGpsLinesLocal.isSelected());
-                Main.pref.put("draw.rawgps.max-line-length.local" + layerNameDot,
+                Config.getPref().put("draw.rawgps.max-line-length.local" + layerNameDot,
                         drawRawGpsMaxLineLengthLocal.getText());
             }
-            Main.pref.putBoolean("draw.rawgps.lines.force"+layerNameDot, forceRawGpsLines.isSelected());
-            Main.pref.putBoolean("draw.rawgps.direction"+layerNameDot, drawGpsArrows.isSelected());
-            Main.pref.putBoolean("draw.rawgps.alternatedirection"+layerNameDot, drawGpsArrowsFast.isSelected());
-            Main.pref.put("draw.rawgps.min-arrow-distance"+layerNameDot, drawGpsArrowsMinDist.getText());
-        }
-
-        Main.pref.putBoolean("draw.rawgps.hdopcircle"+layerNameDot, hdopCircleGpsPoints.isSelected());
-        Main.pref.putBoolean("draw.rawgps.large"+layerNameDot, largeGpsPoints.isSelected());
-        Main.pref.put("draw.rawgps.linewidth"+layerNameDot, drawLineWidth.getText());
-        Main.pref.putBoolean("draw.rawgps.lines.alpha-blend"+layerNameDot, drawLineWithAlpha.isSelected());
-
-        Main.pref.putBoolean("mappaint.gpx.use-antialiasing", useGpsAntialiasing.isSelected());
+            Config.getPref().putBoolean("draw.rawgps.lines.force"+layerNameDot, forceRawGpsLines.isSelected());
+            Config.getPref().putBoolean("draw.rawgps.direction"+layerNameDot, drawGpsArrows.isSelected());
+            Config.getPref().putBoolean("draw.rawgps.alternatedirection"+layerNameDot, drawGpsArrowsFast.isSelected());
+            Config.getPref().put("draw.rawgps.min-arrow-distance"+layerNameDot, drawGpsArrowsMinDist.getText());
+        }
+
+        Config.getPref().putBoolean("draw.rawgps.hdopcircle"+layerNameDot, hdopCircleGpsPoints.isSelected());
+        Config.getPref().putBoolean("draw.rawgps.large"+layerNameDot, largeGpsPoints.isSelected());
+        Config.getPref().put("draw.rawgps.linewidth"+layerNameDot, drawLineWidth.getText());
+        Config.getPref().putBoolean("draw.rawgps.lines.alpha-blend"+layerNameDot, drawLineWithAlpha.isSelected());
+
+        Config.getPref().putBoolean("mappaint.gpx.use-antialiasing", useGpsAntialiasing.isSelected());
 
         TemplateEntryProperty.forMarker(layerName).put(waypointLabelPattern.getText());
@@ -492,28 +493,28 @@
 
         if (colorTypeGlobal.isSelected()) {
-            Main.pref.put("draw.rawgps.colors"+layerNameDot, null);
-            Main.pref.put("draw.rawgps.colors.dynamic"+layerNameDot, null);
-            Main.pref.put("draw.rawgps.colorTracksTunec"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.colors"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.colors.dynamic"+layerNameDot, null);
+            Config.getPref().put("draw.rawgps.colorTracksTunec"+layerNameDot, null);
             return false;
         } else if (colorTypeVelocity.isSelected()) {
-            Main.pref.putInt("draw.rawgps.colors"+layerNameDot, 1);
+            Config.getPref().putInt("draw.rawgps.colors"+layerNameDot, 1);
         } else if (colorTypeDilution.isSelected()) {
-            Main.pref.putInt("draw.rawgps.colors"+layerNameDot, 2);
+            Config.getPref().putInt("draw.rawgps.colors"+layerNameDot, 2);
         } else if (colorTypeDirection.isSelected()) {
-            Main.pref.putInt("draw.rawgps.colors"+layerNameDot, 3);
+            Config.getPref().putInt("draw.rawgps.colors"+layerNameDot, 3);
         } else if (colorTypeTime.isSelected()) {
-            Main.pref.putInt("draw.rawgps.colors"+layerNameDot, 4);
+            Config.getPref().putInt("draw.rawgps.colors"+layerNameDot, 4);
         } else if (colorTypeHeatMap.isSelected()) {
-            Main.pref.putInt("draw.rawgps.colors"+layerNameDot, 5);
+            Config.getPref().putInt("draw.rawgps.colors"+layerNameDot, 5);
         } else {
-            Main.pref.putInt("draw.rawgps.colors"+layerNameDot, 0);
-        }
-        Main.pref.putBoolean("draw.rawgps.colors.dynamic"+layerNameDot, colorDynamic.isSelected());
+            Config.getPref().putInt("draw.rawgps.colors"+layerNameDot, 0);
+        }
+        Config.getPref().putBoolean("draw.rawgps.colors.dynamic"+layerNameDot, colorDynamic.isSelected());
         int ccti = colorTypeVelocityTune.getSelectedIndex();
-        Main.pref.putInt("draw.rawgps.colorTracksTune"+layerNameDot, ccti == 2 ? 10 : (ccti == 1 ? 20 : 45));
-        Main.pref.putInt("draw.rawgps.heatmap.colormap"+layerNameDot, colorTypeHeatMapTune.getSelectedIndex());
-        Main.pref.putBoolean("draw.rawgps.heatmap.use-points"+layerNameDot, colorTypeHeatMapPoints.isSelected());
-        Main.pref.putInt("draw.rawgps.heatmap.gain"+layerNameDot, colorTypeHeatMapGain.getValue());
-        Main.pref.putInt("draw.rawgps.heatmap.lower-limit"+layerNameDot, colorTypeHeatMapLowerLimit.getValue());
+        Config.getPref().putInt("draw.rawgps.colorTracksTune"+layerNameDot, ccti == 2 ? 10 : (ccti == 1 ? 20 : 45));
+        Config.getPref().putInt("draw.rawgps.heatmap.colormap"+layerNameDot, colorTypeHeatMapTune.getSelectedIndex());
+        Config.getPref().putBoolean("draw.rawgps.heatmap.use-points"+layerNameDot, colorTypeHeatMapPoints.isSelected());
+        Config.getPref().putInt("draw.rawgps.heatmap.gain"+layerNameDot, colorTypeHeatMapGain.getValue());
+        Config.getPref().putInt("draw.rawgps.heatmap.lower-limit"+layerNameDot, colorTypeHeatMapLowerLimit.getValue());
 
         return false;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 12846)
@@ -39,4 +39,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -124,14 +125,14 @@
         // Show splash screen on startup
         showSplashScreen.setToolTipText(tr("Show splash screen at startup"));
-        showSplashScreen.setSelected(Main.pref.getBoolean("draw.splashscreen", true));
+        showSplashScreen.setSelected(Config.getPref().getBoolean("draw.splashscreen", true));
         panel.add(showSplashScreen, GBC.eop().insets(20, 0, 0, 0));
 
         // Show ID in selection
         showID.setToolTipText(tr("Show object ID in selection lists"));
-        showID.setSelected(Main.pref.getBoolean("osm-primitives.showid", false));
+        showID.setSelected(Config.getPref().getBoolean("osm-primitives.showid", false));
 
         // Show localized names
         showLocalizedName.setToolTipText(tr("Show localized name in selection lists, if available"));
-        showLocalizedName.setSelected(Main.pref.getBoolean("osm-primitives.localize-name", true));
+        showLocalizedName.setSelected(Config.getPref().getBoolean("osm-primitives.localize-name", true));
         ExpertToggleAction.addVisibilitySwitcher(showLocalizedName);
 
@@ -202,11 +203,11 @@
     public boolean ok() {
         boolean mod = false;
-        Main.pref.putBoolean("draw.splashscreen", showSplashScreen.isSelected());
-        Main.pref.putBoolean("osm-primitives.showid", showID.isSelected());
-        Main.pref.putBoolean("osm-primitives.localize-name", showLocalizedName.isSelected());
+        Config.getPref().putBoolean("draw.splashscreen", showSplashScreen.isSelected());
+        Config.getPref().putBoolean("osm-primitives.showid", showID.isSelected());
+        Config.getPref().putBoolean("osm-primitives.localize-name", showLocalizedName.isSelected());
         MapFrame.MODELESS.put(modeless.isSelected());
-        Main.pref.putBoolean(ToggleDialog.PROP_DYNAMIC_BUTTONS.getKey(), dynamicButtons.isSelected());
-        Main.pref.putBoolean(DateUtils.PROP_ISO_DATES.getKey(), isoDates.isSelected());
-        Main.pref.putBoolean(FileChooserManager.PROP_USE_NATIVE_FILE_DIALOG.getKey(), nativeFileChoosers.isSelected());
+        Config.getPref().putBoolean(ToggleDialog.PROP_DYNAMIC_BUTTONS.getKey(), dynamicButtons.isSelected());
+        Config.getPref().putBoolean(DateUtils.PROP_ISO_DATES.getKey(), isoDates.isSelected());
+        Config.getPref().putBoolean(FileChooserManager.PROP_USE_NATIVE_FILE_DIALOG.getKey(), nativeFileChoosers.isSelected());
         MapMover.PROP_ZOOM_REVERSE_WHEEL.put(zoomReverseWheel.isSelected());
         NavigatableComponent.PROP_ZOOM_INTERMEDIATE_STEPS.put(zoomIntermediateSteps.isSelected());
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java	(revision 12846)
@@ -18,5 +18,4 @@
 import javax.swing.ListCellRenderer;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
@@ -25,4 +24,5 @@
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.I18n;
@@ -55,5 +55,5 @@
         // Selecting the language BEFORE the JComboBox listens to model changes speed up initialization by ~35ms (see #7386)
         // See https://stackoverflow.com/questions/3194958/fast-replacement-for-jcombobox-basiccomboboxui
-        model.selectLanguage(Main.pref.get(LANGUAGE));
+        model.selectLanguage(Config.getPref().get(LANGUAGE));
         langCombo = new JosmComboBox<>(model);
         langCombo.setRenderer(new LanguageCellRenderer());
@@ -73,7 +73,7 @@
     public boolean ok() {
         if (langCombo.getSelectedItem() == null)
-            return Main.pref.put(LANGUAGE, null);
+            return Config.getPref().put(LANGUAGE, null);
         else
-            return Main.pref.put(LANGUAGE,
+            return Config.getPref().put(LANGUAGE,
                     LanguageInfo.getJOSMLocaleCode((Locale) langCombo.getSelectedItem()));
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java	(revision 12846)
@@ -29,4 +29,5 @@
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -65,5 +66,5 @@
     public void addGui(PreferenceTabbedPane gui) {
         enableIconDefault = new JCheckBox(tr("Enable built-in icon defaults"),
-                Main.pref.getBoolean("mappaint.icon.enable-defaults", true));
+                Config.getPref().getBoolean("mappaint.icon.enable-defaults", true));
 
         sources = new MapPaintSourceEditor();
@@ -105,5 +106,5 @@
         @Override
         public Collection<String> getInitialIconPathsList() {
-            return Main.pref.getList(ICONPREF, null);
+            return Config.getPref().getList(ICONPREF, null);
         }
 
@@ -170,5 +171,5 @@
     @Override
     public boolean ok() {
-        boolean reload = Main.pref.putBoolean("mappaint.icon.enable-defaults", enableIconDefault.isSelected());
+        boolean reload = Config.getPref().putBoolean("mappaint.icon.enable-defaults", enableIconDefault.isSelected());
         reload |= sources.finish();
         if (reload) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java	(revision 12846)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -168,5 +169,5 @@
     public void addGui(PreferenceTabbedPane gui) {
         sortMenu = new JCheckBox(tr("Sort presets menu alphabetically"),
-                Main.pref.getBoolean("taggingpreset.sortmenu", false));
+                Config.getPref().getBoolean("taggingpreset.sortmenu", false));
 
         final JPanel panel = new JPanel(new GridBagLayout());
@@ -206,5 +207,5 @@
         @Override
         public Collection<String> getInitialIconPathsList() {
-            return Main.pref.getList(ICONPREF, null);
+            return Config.getPref().getList(ICONPREF, null);
         }
 
@@ -246,5 +247,5 @@
     @Override
     public boolean ok() {
-        boolean restart = Main.pref.putBoolean("taggingpreset.sortmenu", sortMenu.getSelectedObjects() != null);
+        boolean restart = Config.getPref().putBoolean("taggingpreset.sortmenu", sortMenu.getSelectedObjects() != null);
         restart |= sources.finish();
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 12846)
@@ -61,4 +61,5 @@
 import org.openstreetmap.josm.plugins.ReadLocalPluginInformationTask;
 import org.openstreetmap.josm.plugins.ReadRemotePluginInformationTask;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -302,5 +303,5 @@
             List<String> l = new LinkedList<>(model.getSelectedPluginNames());
             Collections.sort(l);
-            Main.pref.putList("plugins", l);
+            Config.getPref().putList("plugins", l);
             if (!model.getNewlyDeactivatedPlugins().isEmpty())
                 return true;
@@ -359,5 +360,5 @@
                         model.updateAvailablePlugins(task.getAvailablePlugins());
                         pnlPluginPreferences.refreshView();
-                        Main.pref.putInt("pluginmanager.version", Version.getInstance().getVersion()); // fix #7030
+                        Config.getPref().putInt("pluginmanager.version", Version.getInstance().getVersion()); // fix #7030
                     });
                 }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java	(revision 12846)
@@ -15,9 +15,9 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.plugins.PluginException;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.plugins.PluginInformation;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -40,5 +40,5 @@
     public PluginPreferencesModel() {
         currentActivePlugins = new HashSet<>();
-        currentActivePlugins.addAll(Main.pref.getList("plugins"));
+        currentActivePlugins.addAll(Config.getPref().getList("plugins"));
     }
 
@@ -80,5 +80,5 @@
         filterDisplayedPlugins(filterExpression);
         Set<String> activePlugins = new HashSet<>();
-        activePlugins.addAll(Main.pref.getList("plugins"));
+        activePlugins.addAll(Config.getPref().getList("plugins"));
         for (PluginInformation pi: availablePlugins) {
             if (selectedPluginsMap.get(pi) == null && activePlugins.contains(pi.name)) {
@@ -230,5 +230,5 @@
      */
     public void initFromPreferences() {
-        Collection<String> enabledPlugins = Main.pref.getList("plugins", null);
+        Collection<String> enabledPlugins = Config.getPref().getList("plugins", null);
         if (enabledPlugins == null) {
             this.selectedPluginsMap.clear();
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java	(revision 12846)
@@ -20,9 +20,9 @@
 import javax.swing.event.ChangeListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.plugins.PluginHandler;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -175,14 +175,12 @@
      */
     public final void initFromPreferences() {
-        rbVersionBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(
-                Main.pref.get("pluginmanager.version-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
-        rbTimeBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(
-                Main.pref.get("pluginmanager.time-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
-
-        String pref = Main.pref.get("pluginmanager.warntime", null);
+        rbVersionBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(Config.getPref().get("pluginmanager.version-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
+        rbTimeBasedUpatePolicy.get(Optional.ofNullable(Policy.fromPreferenceValue(Config.getPref().get("pluginmanager.time-based-update.policy", "ask"))).orElse(Policy.ASK)).setSelected(true);
+
+        String pref = Config.getPref().get("pluginmanager.warntime", null);
         int days = 0;
         if (pref != null) {
             // remove legacy preference
-            Main.pref.put("pluginmanager.warntime", null);
+            Config.getPref().put("pluginmanager.warntime", null);
             try {
                 days = Integer.parseInt(pref.trim());
@@ -196,5 +194,5 @@
         }
         if (days == 0) {
-            days = Main.pref.getInt("pluginmanager.time-based-update.interval", PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL);
+            days = Config.getPref().getInt("pluginmanager.time-based-update.interval", PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL);
         }
         tfUpdateInterval.setText(Integer.toString(days));
@@ -210,5 +208,5 @@
         for (Policy p: Policy.values()) {
             if (rbVersionBasedUpatePolicy.get(p).isSelected()) {
-                Main.pref.put("pluginmanager.version-based-update.policy", p.getPreferencesValue());
+                Config.getPref().put("pluginmanager.version-based-update.policy", p.getPreferencesValue());
                 break;
             }
@@ -219,5 +217,5 @@
         for (Policy p: Policy.values()) {
             if (rbTimeBasedUpatePolicy.get(p).isSelected()) {
-                Main.pref.put("pluginmanager.time-based-update.policy", p.getPreferencesValue());
+                Config.getPref().put("pluginmanager.time-based-update.policy", p.getPreferencesValue());
                 break;
             }
@@ -235,5 +233,5 @@
             days = PluginHandler.DEFAULT_TIME_BASED_UPDATE_INTERVAL;
         }
-        Main.pref.putInt("pluginmanager.time-based-update.interval", days);
+        Config.getPref().putInt("pluginmanager.time-based-update.interval", days);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java	(revision 12846)
@@ -20,5 +20,4 @@
 import javax.swing.plaf.basic.BasicComboBoxEditor;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.projection.CustomProjection;
 import org.openstreetmap.josm.data.projection.Projection;
@@ -31,4 +30,5 @@
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -75,5 +75,5 @@
                     "+proj=lonlat +ellps=WGS84 +datum=WGS84 +bounds=-180,-90,180,90",
                     "+proj=tmerc +lat_0=0 +lon_0=9 +k_0=1 +x_0=3500000 +y_0=0 +ellps=bessel +nadgrids=BETA2007.gsb");
-            List<String> inputHistory = new LinkedList<>(Main.pref.getList("projection.custom.value.history", samples));
+            List<String> inputHistory = new LinkedList<>(Config.getPref().getList("projection.custom.value.history", samples));
             Collections.reverse(inputHistory);
             cbInput.setPossibleItems(inputHistory);
@@ -149,5 +149,5 @@
         public void rememberHistory() {
             cbInput.addCurrentItemToHistory();
-            Main.pref.putList("projection.custom.value.history", cbInput.getHistory());
+            Config.getPref().putList("projection.custom.value.history", cbInput.getHistory());
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 12846)
@@ -41,4 +41,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -482,5 +483,5 @@
         }
         id = pc.getId();
-        Main.pref.putList("projection.sub."+id, pref == null ? null : new ArrayList<>(pref));
+        Config.getPref().putList("projection.sub."+id, pref == null ? null : new ArrayList<>(pref));
         if (makeDefault) {
             PROP_PROJECTION_DEFAULT.put(id);
@@ -560,5 +561,5 @@
      */
     public static Collection<String> getSubprojectionPreference(String pcId) {
-        return Main.pref.getList("projection.sub."+pcId, null);
+        return Config.getPref().getList("projection.sub."+pcId, null);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java	(revision 12846)
@@ -38,4 +38,5 @@
 import org.openstreetmap.josm.io.remotecontrol.RemoteControlHttpsServer;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -93,6 +94,6 @@
                 + tr("JOSM will always listen at <b>port {0}</b> (http) and <b>port {1}</b> (https) on localhost."
                 + "<br>These ports are not configurable because they are referenced by external applications talking to JOSM.",
-                Main.pref.get("remote.control.port", "8111"),
-                Main.pref.get("remote.control.https.port", "8112")) + "</html>");
+                Config.getPref().get("remote.control.port", "8111"),
+                Config.getPref().get("remote.control.https.port", "8112")) + "</html>");
         portLabel.setFont(portLabel.getFont().deriveFont(Font.PLAIN));
         remote.add(portLabel, GBC.eol().insets(5, 5, 0, 10).fill(GBC.HORIZONTAL));
@@ -167,6 +168,6 @@
         remote.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
 
-        loadInNewLayer.setSelected(Main.pref.getBoolean(RequestHandler.loadInNewLayerKey, RequestHandler.loadInNewLayerDefault));
-        alwaysAskUserConfirm.setSelected(Main.pref.getBoolean(RequestHandler.globalConfirmationKey, RequestHandler.globalConfirmationDefault));
+        loadInNewLayer.setSelected(Config.getPref().getBoolean(RequestHandler.loadInNewLayerKey, RequestHandler.loadInNewLayerDefault));
+        alwaysAskUserConfirm.setSelected(Config.getPref().getBoolean(RequestHandler.globalConfirmationKey, RequestHandler.globalConfirmationDefault));
 
         ActionListener remoteControlEnabled = e -> {
@@ -196,8 +197,8 @@
         if (enabled) {
             for (Entry<PermissionPrefWithDefault, JCheckBox> p : prefs.entrySet()) {
-                Main.pref.putBoolean(p.getKey().pref, p.getValue().isSelected());
-            }
-            Main.pref.putBoolean(RequestHandler.loadInNewLayerKey, loadInNewLayer.isSelected());
-            Main.pref.putBoolean(RequestHandler.globalConfirmationKey, alwaysAskUserConfirm.isSelected());
+                Config.getPref().putBoolean(p.getKey().pref, p.getValue().isSelected());
+            }
+            Config.getPref().putBoolean(RequestHandler.loadInNewLayerKey, loadInNewLayer.isSelected());
+            Config.getPref().putBoolean(RequestHandler.globalConfirmationKey, alwaysAskUserConfirm.isSelected());
         }
         if (changed) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java	(revision 12846)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -143,5 +144,5 @@
             authMethod = "oauth";
         }
-        Main.pref.put("osm-server.auth-method", authMethod);
+        Config.getPref().put("osm-server.auth-method", authMethod);
         if ("basic".equals(authMethod)) {
             // save username and password and clear the OAuth token
Index: trunk/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java	(revision 12846)
@@ -27,5 +27,4 @@
 import javax.swing.text.JTextComponent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.ListProperty;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -37,4 +36,5 @@
 import org.openstreetmap.josm.io.OsmApiInitializationException;
 import org.openstreetmap.josm.io.OsmTransferCanceledException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -145,7 +145,7 @@
         String hmiUrl = getStrippedApiUrl();
         if (cbUseDefaultServerUrl.isSelected() || OsmApi.DEFAULT_API_URL.equals(hmiUrl)) {
-            Main.pref.put("osm-server.url", null);
+            Config.getPref().put("osm-server.url", null);
         } else {
-            Main.pref.put("osm-server.url", hmiUrl);
+            Config.getPref().put("osm-server.url", hmiUrl);
             tfOsmServerUrl.addCurrentItemToHistory();
             SERVER_URL_HISTORY.put(tfOsmServerUrl.getHistory());
Index: trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java	(revision 12846)
@@ -25,5 +25,4 @@
 import javax.swing.JRadioButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -36,4 +35,5 @@
 import org.openstreetmap.josm.io.auth.CredentialsAgentException;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -264,25 +264,25 @@
      */
     public final void initFromPreferences() {
-        ProxyPolicy pp = Optional.ofNullable(ProxyPolicy.fromName(Main.pref.get(DefaultProxySelector.PROXY_POLICY, null)))
+        ProxyPolicy pp = Optional.ofNullable(ProxyPolicy.fromName(Config.getPref().get(DefaultProxySelector.PROXY_POLICY, null)))
                 .orElse(ProxyPolicy.NO_PROXY);
         rbProxyPolicy.get(pp).setSelected(true);
-        String value = Main.pref.get("proxy.host", null);
+        String value = Config.getPref().get("proxy.host", null);
         if (value != null) {
             // legacy support
             tfProxyHttpHost.setText(value);
-            Main.pref.put("proxy.host", null);
+            Config.getPref().put("proxy.host", null);
         } else {
-            tfProxyHttpHost.setText(Main.pref.get(DefaultProxySelector.PROXY_HTTP_HOST, ""));
-        }
-        value = Main.pref.get("proxy.port", null);
+            tfProxyHttpHost.setText(Config.getPref().get(DefaultProxySelector.PROXY_HTTP_HOST, ""));
+        }
+        value = Config.getPref().get("proxy.port", null);
         if (value != null) {
             // legacy support
             tfProxyHttpPort.setText(value);
-            Main.pref.put("proxy.port", null);
+            Config.getPref().put("proxy.port", null);
         } else {
-            tfProxyHttpPort.setText(Main.pref.get(DefaultProxySelector.PROXY_HTTP_PORT, ""));
-        }
-        tfProxySocksHost.setText(Main.pref.get(DefaultProxySelector.PROXY_SOCKS_HOST, ""));
-        tfProxySocksPort.setText(Main.pref.get(DefaultProxySelector.PROXY_SOCKS_PORT, ""));
+            tfProxyHttpPort.setText(Config.getPref().get(DefaultProxySelector.PROXY_HTTP_PORT, ""));
+        }
+        tfProxySocksHost.setText(Config.getPref().get(DefaultProxySelector.PROXY_SOCKS_HOST, ""));
+        tfProxySocksPort.setText(Config.getPref().get(DefaultProxySelector.PROXY_SOCKS_PORT, ""));
 
         if (pp.equals(ProxyPolicy.USE_SYSTEM_SETTINGS) && !DefaultProxySelector.willJvmRetrieveSystemProxies()) {
@@ -358,9 +358,9 @@
             }
         }
-        Main.pref.put(DefaultProxySelector.PROXY_POLICY, Optional.ofNullable(policy).orElse(ProxyPolicy.NO_PROXY).getName());
-        Main.pref.put(DefaultProxySelector.PROXY_HTTP_HOST, tfProxyHttpHost.getText());
-        Main.pref.put(DefaultProxySelector.PROXY_HTTP_PORT, tfProxyHttpPort.getText());
-        Main.pref.put(DefaultProxySelector.PROXY_SOCKS_HOST, tfProxySocksHost.getText());
-        Main.pref.put(DefaultProxySelector.PROXY_SOCKS_PORT, tfProxySocksPort.getText());
+        Config.getPref().put(DefaultProxySelector.PROXY_POLICY, Optional.ofNullable(policy).orElse(ProxyPolicy.NO_PROXY).getName());
+        Config.getPref().put(DefaultProxySelector.PROXY_HTTP_HOST, tfProxyHttpHost.getText());
+        Config.getPref().put(DefaultProxySelector.PROXY_HTTP_PORT, tfProxyHttpPort.getText());
+        Config.getPref().put(DefaultProxySelector.PROXY_SOCKS_HOST, tfProxySocksHost.getText());
+        Config.getPref().put(DefaultProxySelector.PROXY_SOCKS_PORT, tfProxySocksPort.getText());
 
         // update the proxy selector
Index: trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java	(revision 12846)
@@ -12,8 +12,8 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.sources.ExtendedSourceEntry;
-import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.preferences.sources.SourceEntry;
 import org.openstreetmap.josm.data.preferences.sources.SourceProvider;
 import org.openstreetmap.josm.data.preferences.sources.SourceType;
+import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java	(revision 12846)
@@ -16,5 +16,4 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.validation.OsmValidator;
@@ -28,4 +27,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -116,6 +116,6 @@
         OsmValidator.initializeTests(testsToInitialize);
 
-        Main.pref.putList(ValidatorPrefHelper.PREF_SKIP_TESTS, tests);
-        Main.pref.putList(ValidatorPrefHelper.PREF_SKIP_TESTS_BEFORE_UPLOAD, testsBeforeUpload);
+        Config.getPref().putList(ValidatorPrefHelper.PREF_SKIP_TESTS, tests);
+        Config.getPref().putList(ValidatorPrefHelper.PREF_SKIP_TESTS_BEFORE_UPLOAD, testsBeforeUpload);
         ValidatorPrefHelper.PREF_USE_IGNORE.put(prefUseIgnore.isSelected());
         ValidatorPrefHelper.PREF_OTHER.put(prefOther.isSelected());
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java	(revision 12846)
@@ -23,9 +23,9 @@
 import javax.swing.text.StyleConstants;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -140,5 +140,5 @@
             Object item;
             // if the text is a number we don't autocomplete
-            if (Main.pref.getBoolean("autocomplete.dont_complete_numbers", true)) {
+            if (Config.getPref().getBoolean("autocomplete.dont_complete_numbers", true)) {
                 try {
                     Long.parseLong(str);
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java	(revision 12846)
@@ -20,7 +20,7 @@
 import javax.swing.text.StyleConstants;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.CellEditorSupport;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -79,5 +79,5 @@
             String currentText = getText(0, getLength());
             // if the text starts with a number we don't autocomplete
-            if (Main.pref.getBoolean("autocomplete.dont_complete_numbers", true)) {
+            if (Config.getPref().getBoolean("autocomplete.dont_complete_numbers", true)) {
                 try {
                     Long.parseLong(str);
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 12846)
@@ -60,4 +60,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.items.Space;
 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.ImageProvider;
@@ -210,5 +211,5 @@
         }
         File arch = TaggingPresetReader.getZipIcons();
-        final Collection<String> s = Main.pref.getList("taggingpreset.icon.sources", null);
+        final Collection<String> s = Config.getPref().getList("taggingpreset.icon.sources", null);
         ImageProvider imgProv = new ImageProvider(iconName);
         imgProv.setDirs(s);
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 12846)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -127,5 +128,5 @@
 
     protected static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
-        final Collection<String> s = Main.pref.getList("taggingpreset.icon.sources", null);
+        final Collection<String> s = Config.getPref().getList("taggingpreset.icon.sources", null);
         ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
         if (maxSize != null) {
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java	(revision 12846)
@@ -14,5 +14,4 @@
 import javax.swing.JSeparator;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -22,4 +21,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles.Role;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.MultiMap;
@@ -91,10 +91,10 @@
             }
             for (JMenu submenu : submenus.values()) {
-                if (submenu.getItemCount() >= Main.pref.getInt("taggingpreset.min-elements-for-scroller", 15)) {
+                if (submenu.getItemCount() >= Config.getPref().getInt("taggingpreset.min-elements-for-scroller", 15)) {
                     MenuScroller.setScrollerFor(submenu);
                 }
             }
         }
-        if (Main.pref.getBoolean("taggingpreset.sortmenu")) {
+        if (Config.getPref().getBoolean("taggingpreset.sortmenu")) {
             TaggingPresetMenu.sortMenu(MainApplication.getMenu().presetsMenu);
         }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 12846)
@@ -4,9 +4,9 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPriority;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -56,5 +56,5 @@
         AutoCompletingTextField tf = new AutoCompletingTextField();
         initAutoCompletionField(tf, key);
-        if (Main.pref.getBoolean("taggingpreset.display-keys-as-hint", true)) {
+        if (Config.getPref().getBoolean("taggingpreset.display-keys-as-hint", true)) {
             tf.setHint(key);
         }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 12846)
@@ -31,9 +31,9 @@
 import javax.swing.ListModel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSelector;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.GBC;
@@ -493,5 +493,5 @@
         }
 
-        if (values_sort && Main.pref.getBoolean("taggingpreset.sortvalues", true)) {
+        if (values_sort && Config.getPref().getBoolean("taggingpreset.sortvalues", true)) {
             Collections.sort(entries);
         }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Roles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Roles.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Roles.java	(revision 12846)
@@ -15,7 +15,7 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.data.osm.search.SearchSetting;
-import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java	(revision 12846)
@@ -22,5 +22,4 @@
 import javax.swing.JToggleButton;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
@@ -29,4 +28,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -72,5 +72,5 @@
             initAutoCompletionField(textField, key);
         }
-        if (Main.pref.getBoolean("taggingpreset.display-keys-as-hint", true)) {
+        if (Config.getPref().getBoolean("taggingpreset.display-keys-as-hint", true)) {
             textField.setHint(key);
         }
Index: trunk/src/org/openstreetmap/josm/gui/util/WindowGeometry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/WindowGeometry.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/util/WindowGeometry.java	(revision 12846)
@@ -20,4 +20,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -206,5 +207,5 @@
 
     protected final void initFromPreferences(String preferenceKey) throws WindowGeometryException {
-        String value = Main.pref.get(preferenceKey);
+        String value = Config.getPref().get(preferenceKey);
         if (value.isEmpty())
             throw new WindowGeometryException(
@@ -275,5 +276,5 @@
         value.append("x=").append(topLeft.x).append(",y=").append(topLeft.y)
              .append(",width=").append(extent.width).append(",height=").append(extent.height);
-        Main.pref.put(preferenceKey, value.toString());
+        Config.getPref().put(preferenceKey, value.toString());
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java	(revision 12846)
@@ -9,6 +9,6 @@
 import javax.swing.text.JTextComponent;
 
+import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchParseError;
-import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.tools.Logging;
 
Index: trunk/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/FileChooserManager.java	(revision 12846)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -90,7 +91,7 @@
         this.open = open;
         this.lastDirProperty = lastDirProperty == null || lastDirProperty.isEmpty() ? "lastDirectory" : lastDirProperty;
-        this.curDir = Main.pref.get(this.lastDirProperty).isEmpty() ?
+        this.curDir = Config.getPref().get(this.lastDirProperty).isEmpty() ?
                 defaultDir == null || defaultDir.isEmpty() ? "." : defaultDir
-                : Main.pref.get(this.lastDirProperty);
+                : Config.getPref().get(this.lastDirProperty);
     }
 
@@ -345,5 +346,5 @@
 
         if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-            Main.pref.put(lastDirProperty, fc.getCurrentDirectory().getAbsolutePath());
+            Config.getPref().put(lastDirProperty, fc.getCurrentDirectory().getAbsolutePath());
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java	(revision 12846)
@@ -6,6 +6,6 @@
 import javax.swing.text.JTextComponent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -24,5 +24,5 @@
      */
     public HistoryComboBox() {
-        int maxsize = Main.pref.getInt("search.history-size", DEFAULT_SEARCH_HISTORY_SIZE);
+        int maxsize = Config.getPref().getInt("search.history-size", DEFAULT_SEARCH_HISTORY_SIZE);
         model = new ComboBoxHistory(maxsize);
         setModel(model);
Index: trunk/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java	(revision 12846)
@@ -23,5 +23,5 @@
 import javax.swing.undo.UndoManager;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -172,5 +172,5 @@
             JMenuItem mi = new JMenuItem(action);
             mi.setText(label);
-            if (iconName != null && Main.pref.getBoolean("text.popupmenu.useicons", true)) {
+            if (iconName != null && Config.getPref().getBoolean("text.popupmenu.useicons", true)) {
                 ImageIcon icon = ImageProvider.get(iconName, ImageProvider.ImageSizes.SMALLICON);
                 if (icon != null) {
Index: trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java	(revision 12846)
@@ -12,4 +12,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -91,5 +92,5 @@
             return false;
         }
-        return Main.pref.getInt("cache." + ident, 0) + updateInterval < TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())
+        return Config.getPref().getInt("cache." + ident, 0) + updateInterval < TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())
                 || !isCacheValid();
     }
@@ -141,5 +142,5 @@
         this.data = updateData();
         saveToDisk();
-        Main.pref.putInt("cache." + ident, (int) (TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())));
+        Config.getPref().putInt("cache." + ident, (int) (TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())));
         return data;
     }
Index: trunk/src/org/openstreetmap/josm/io/CachedFile.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/CachedFile.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/CachedFile.java	(revision 12846)
@@ -28,4 +28,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.Logging;
@@ -381,5 +382,5 @@
             if (!"file".equals(url.getProtocol())) {
                 String prefKey = getPrefKey(url, destDir);
-                List<String> localPath = new ArrayList<>(Main.pref.getList(prefKey));
+                List<String> localPath = new ArrayList<>(Config.getPref().getList(prefKey));
                 if (localPath.size() == 2) {
                     File lfile = new File(localPath.get(1));
@@ -388,5 +389,5 @@
                     }
                 }
-                Main.pref.putList(prefKey, null);
+                Config.getPref().putList(prefKey, null);
             }
         } catch (MalformedURLException e) {
@@ -419,5 +420,5 @@
         Long ifModifiedSince = null;
         File localFile = null;
-        List<String> localPathEntry = new ArrayList<>(Main.pref.getList(prefKey));
+        List<String> localPathEntry = new ArrayList<>(Config.getPref().getList(prefKey));
         boolean offline = false;
         try {
@@ -476,5 +477,5 @@
                 if (localFile == null)
                     throw new AssertionError();
-                Main.pref.putList(prefKey,
+                Config.getPref().putList(prefKey,
                         Arrays.asList(Long.toString(System.currentTimeMillis()), localPathEntry.get(1)));
                 return localFile;
@@ -488,5 +489,5 @@
             localFile = new File(destDir, localPath);
             if (Main.platform.rename(destDirFile, localFile)) {
-                Main.pref.putList(prefKey,
+                Config.getPref().putList(prefKey,
                         Arrays.asList(Long.toString(System.currentTimeMillis()), localFile.toString()));
             } else {
Index: trunk/src/org/openstreetmap/josm/io/CertificateAmendment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/CertificateAmendment.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/CertificateAmendment.java	(revision 12846)
@@ -29,4 +29,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -119,5 +120,5 @@
      */
     public static void addMissingCertificates() throws IOException, GeneralSecurityException {
-        if (!Main.pref.getBoolean("tls.add-missing-certificates", true))
+        if (!Config.getPref().getBoolean("tls.add-missing-certificates", true))
             return;
         KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
Index: trunk/src/org/openstreetmap/josm/io/DefaultProxySelector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/DefaultProxySelector.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/DefaultProxySelector.java	(revision 12846)
@@ -18,5 +18,5 @@
 import java.util.TreeSet;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -126,5 +126,5 @@
      */
     public final void initFromPreferences() {
-        String value = Main.pref.get(PROXY_POLICY);
+        String value = Config.getPref().get(PROXY_POLICY);
         if (value.isEmpty()) {
             proxyPolicy = ProxyPolicy.NO_PROXY;
@@ -137,6 +137,6 @@
             }
         }
-        String host = Main.pref.get(PROXY_HTTP_HOST, null);
-        int port = parseProxyPortValue(PROXY_HTTP_PORT, Main.pref.get(PROXY_HTTP_PORT, null));
+        String host = Config.getPref().get(PROXY_HTTP_HOST, null);
+        int port = parseProxyPortValue(PROXY_HTTP_PORT, Config.getPref().get(PROXY_HTTP_PORT, null));
         httpProxySocketAddress = null;
         if (proxyPolicy.equals(ProxyPolicy.USE_HTTP_PROXY)) {
@@ -149,6 +149,6 @@
         }
 
-        host = Main.pref.get(PROXY_SOCKS_HOST, null);
-        port = parseProxyPortValue(PROXY_SOCKS_PORT, Main.pref.get(PROXY_SOCKS_PORT, null));
+        host = Config.getPref().get(PROXY_SOCKS_HOST, null);
+        port = parseProxyPortValue(PROXY_SOCKS_PORT, Config.getPref().get(PROXY_SOCKS_PORT, null));
         socksProxySocketAddress = null;
         if (proxyPolicy.equals(ProxyPolicy.USE_SOCKS_PROXY)) {
@@ -161,5 +161,5 @@
         }
         proxyExceptions = new HashSet<>(
-            Main.pref.getList(PROXY_EXCEPTIONS,
+            Config.getPref().getList(PROXY_EXCEPTIONS,
                     Arrays.asList("localhost", IPV4_LOOPBACK, IPV6_LOOPBACK))
         );
Index: trunk/src/org/openstreetmap/josm/io/MessageNotifier.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 12846)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.io.auth.CredentialsManager;
 import org.openstreetmap.josm.io.auth.JosmPreferencesCredentialAgent;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -142,6 +143,6 @@
                         return credManager.lookupOAuthAccessToken() != null;
                     } else {
-                        String username = Main.pref.get("osm-server.username", null);
-                        String password = Main.pref.get("osm-server.password", null);
+                        String username = Config.getPref().get("osm-server.username", null);
+                        String password = Config.getPref().get("osm-server.password", null);
                         return username != null && !username.isEmpty() && password != null && !password.isEmpty();
                     }
Index: trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 12846)
@@ -24,5 +24,4 @@
 import java.util.concurrent.Future;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSetMerger;
@@ -37,4 +36,5 @@
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -321,5 +321,5 @@
         // Build a list of fetchers that will  download smaller sets containing only MAX_IDS_PER_REQUEST (200) primitives each.
         // we will run up to MAX_DOWNLOAD_THREADS concurrent fetchers.
-        int threadsNumber = Main.pref.getInt("osm.download.threads", OsmApi.MAX_DOWNLOAD_THREADS);
+        int threadsNumber = Config.getPref().getInt("osm.download.threads", OsmApi.MAX_DOWNLOAD_THREADS);
         threadsNumber = Utils.clamp(threadsNumber, 1, OsmApi.MAX_DOWNLOAD_THREADS);
         final ExecutorService exec = Executors.newFixedThreadPool(
Index: trunk/src/org/openstreetmap/josm/io/OsmApi.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 12846)
@@ -33,4 +33,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.Capabilities.CapabilitiesParser;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.HttpClient;
@@ -132,5 +133,5 @@
 
     private static String getServerUrlFromPref() {
-        return Main.pref.get("osm-server.url", DEFAULT_API_URL);
+        return Config.getPref().get("osm-server.url", DEFAULT_API_URL);
     }
 
@@ -593,5 +594,5 @@
      */
     protected int getMaxRetries() {
-        int ret = Main.pref.getInt("osm-server.max-num-retries", DEFAULT_MAX_NUM_RETRIES);
+        int ret = Config.getPref().getInt("osm-server.max-num-retries", DEFAULT_MAX_NUM_RETRIES);
         return Math.max(ret, 0);
     }
@@ -611,5 +612,5 @@
      */
     public static String getAuthMethod() {
-        return Main.pref.get("osm-server.auth-method", "oauth");
+        return Config.getPref().get("osm-server.auth-method", "oauth");
     }
 
Index: trunk/src/org/openstreetmap/josm/io/UploadStrategy.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/UploadStrategy.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/UploadStrategy.java	(revision 12846)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -76,5 +77,5 @@
      */
     public static UploadStrategy getFromPreferences() {
-        String v = Main.pref.get("osm-server.upload-strategy", null);
+        String v = Config.getPref().get("osm-server.upload-strategy", null);
         if (v == null) {
             // legacy support. Until 12/2009 we had osm-server.atomic-upload only.
@@ -82,5 +83,5 @@
             // When the preferences are saved the next time, "osm-server.upload-strategy"
             // will be inserted.
-            v = Main.pref.get("osm-server.atomic-upload", null);
+            v = Config.getPref().get("osm-server.atomic-upload", null);
             if (v != null) {
                 Main.pref.removeFromCollection("osm-server.atomic-upload", v);
@@ -110,5 +111,5 @@
      */
     public static void saveToPreferences(UploadStrategy strategy) {
-        Main.pref.put("osm-server.upload-strategy", strategy.getPreferenceValue());
+        Config.getPref().put("osm-server.upload-strategy", strategy.getPreferenceValue());
     }
 }
Index: trunk/src/org/openstreetmap/josm/io/audio/AudioPlayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/audio/AudioPlayer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/audio/AudioPlayer.java	(revision 12846)
@@ -5,5 +5,5 @@
 import java.net.URL;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.Logging;
@@ -234,6 +234,6 @@
         command = new Execute();
         playingUrl = null;
-        double leadIn = Main.pref.getDouble("audio.leadin", 1.0 /* default, seconds */);
-        double calibration = Main.pref.getDouble("audio.calibration", 1.0 /* default, ratio */);
+        double leadIn = Config.getPref().getDouble("audio.leadin", 1.0 /* default, seconds */);
+        double calibration = Config.getPref().getDouble("audio.calibration", 1.0 /* default, ratio */);
         try {
             soundPlayer = (SoundPlayer) Class.forName("org.openstreetmap.josm.io.audio.JavaFxMediaPlayer").getConstructor().newInstance();
Index: trunk/src/org/openstreetmap/josm/io/audio/AudioUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/audio/AudioUtil.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/audio/AudioUtil.java	(revision 12846)
@@ -16,4 +16,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -44,5 +45,5 @@
                 * audioFormat.getFrameSize() /* bytes per frame */;
             double naturalLength = filesize / bytesPerSecond;
-            double calibration = Main.pref.getDouble("audio.calibration", 1.0 /* default, ratio */);
+            double calibration = Config.getPref().getDouble("audio.calibration", 1.0 /* default, ratio */);
             return naturalLength / calibration;
         } catch (UnsupportedAudioFileException | IOException e) {
Index: trunk/src/org/openstreetmap/josm/io/auth/JosmPreferencesCredentialAgent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/auth/JosmPreferencesCredentialAgent.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/auth/JosmPreferencesCredentialAgent.java	(revision 12846)
@@ -11,9 +11,9 @@
 import javax.swing.text.html.HTMLEditorKit;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
 import org.openstreetmap.josm.io.DefaultProxySelector;
 import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -36,9 +36,9 @@
         case SERVER:
             if (Objects.equals(OsmApi.getOsmApi().getHost(), host)) {
-                user = Main.pref.get("osm-server.username", null);
-                password = Main.pref.get("osm-server.password", null);
+                user = Config.getPref().get("osm-server.username", null);
+                password = Config.getPref().get("osm-server.password", null);
             } else if (host != null) {
-                user = Main.pref.get("server.username."+host, null);
-                password = Main.pref.get("server.password."+host, null);
+                user = Config.getPref().get("server.username."+host, null);
+                password = Config.getPref().get("server.password."+host, null);
             } else {
                 user = null;
@@ -49,6 +49,6 @@
             return new PasswordAuthentication(user, password == null ? new char[0] : password.toCharArray());
         case PROXY:
-            user = Main.pref.get(DefaultProxySelector.PROXY_USER, null);
-            password = Main.pref.get(DefaultProxySelector.PROXY_PASS, null);
+            user = Config.getPref().get(DefaultProxySelector.PROXY_USER, null);
+            password = Config.getPref().get(DefaultProxySelector.PROXY_PASS, null);
             if (user == null)
                 return null;
@@ -68,25 +68,25 @@
         case SERVER:
             if (Objects.equals(OsmApi.getOsmApi().getHost(), host)) {
-                Main.pref.put("osm-server.username", credentials.getUserName());
+                Config.getPref().put("osm-server.username", credentials.getUserName());
                 if (credentials.getPassword() == null) {
-                    Main.pref.put("osm-server.password", null);
+                    Config.getPref().put("osm-server.password", null);
                 } else {
-                    Main.pref.put("osm-server.password", String.valueOf(credentials.getPassword()));
+                    Config.getPref().put("osm-server.password", String.valueOf(credentials.getPassword()));
                 }
             } else if (host != null) {
-                Main.pref.put("server.username."+host, credentials.getUserName());
+                Config.getPref().put("server.username."+host, credentials.getUserName());
                 if (credentials.getPassword() == null) {
-                    Main.pref.put("server.password."+host, null);
+                    Config.getPref().put("server.password."+host, null);
                 } else {
-                    Main.pref.put("server.password."+host, String.valueOf(credentials.getPassword()));
+                    Config.getPref().put("server.password."+host, String.valueOf(credentials.getPassword()));
                 }
             }
             break;
         case PROXY:
-            Main.pref.put(DefaultProxySelector.PROXY_USER, credentials.getUserName());
+            Config.getPref().put(DefaultProxySelector.PROXY_USER, credentials.getUserName());
             if (credentials.getPassword() == null) {
-                Main.pref.put(DefaultProxySelector.PROXY_PASS, null);
+                Config.getPref().put(DefaultProxySelector.PROXY_PASS, null);
             } else {
-                Main.pref.put(DefaultProxySelector.PROXY_PASS, String.valueOf(credentials.getPassword()));
+                Config.getPref().put(DefaultProxySelector.PROXY_PASS, String.valueOf(credentials.getPassword()));
             }
             break;
@@ -103,6 +103,6 @@
     @Override
     public OAuthToken lookupOAuthAccessToken() throws CredentialsAgentException {
-        String accessTokenKey = Main.pref.get("oauth.access-token.key", null);
-        String accessTokenSecret = Main.pref.get("oauth.access-token.secret", null);
+        String accessTokenKey = Config.getPref().get("oauth.access-token.key", null);
+        String accessTokenSecret = Config.getPref().get("oauth.access-token.secret", null);
         if (accessTokenKey == null && accessTokenSecret == null)
             return null;
@@ -119,9 +119,9 @@
     public void storeOAuthAccessToken(OAuthToken accessToken) throws CredentialsAgentException {
         if (accessToken == null) {
-            Main.pref.put("oauth.access-token.key", null);
-            Main.pref.put("oauth.access-token.secret", null);
+            Config.getPref().put("oauth.access-token.key", null);
+            Config.getPref().put("oauth.access-token.secret", null);
         } else {
-            Main.pref.put("oauth.access-token.key", accessToken.getKey());
-            Main.pref.put("oauth.access-token.secret", accessToken.getSecret());
+            Config.getPref().put("oauth.access-token.key", accessToken.getKey());
+            Config.getPref().put("oauth.access-token.secret", accessToken.getSecret());
         }
     }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 12846)
@@ -7,5 +7,5 @@
 import java.util.List;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -54,5 +54,5 @@
 
     public boolean isAllowed() {
-        return Main.pref.getBoolean(pref, defaultVal);
+        return Config.getPref().getBoolean(pref, defaultVal);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java	(revision 12846)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -105,5 +106,5 @@
      */
     public static InetAddress getInet6Address() throws UnknownHostException {
-        for (InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host.ipv6", "::1"))) {
+        for (InetAddress a : InetAddress.getAllByName(Config.getPref().get("remote.control.host.ipv6", "::1"))) {
             if (a instanceof Inet6Address) {
                 return a;
@@ -121,5 +122,5 @@
     public static InetAddress getInet4Address() throws UnknownHostException {
         // Return an address to the loopback interface by default
-        for (InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host.ipv4", "127.0.0.1"))) {
+        for (InetAddress a : InetAddress.getAllByName(Config.getPref().get("remote.control.host.ipv4", "127.0.0.1"))) {
             if (a instanceof Inet4Address) {
                 return a;
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java	(revision 12846)
@@ -9,5 +9,5 @@
 import java.net.SocketException;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -33,5 +33,5 @@
     public static void restartRemoteControlHttpServer() {
         stopRemoteControlHttpServer();
-        int port = Main.pref.getInt("remote.control.port", 8111);
+        int port = Config.getPref().getInt("remote.control.port", 8111);
         try {
             instance4 = new RemoteControlHttpServer(port, false);
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java	(revision 12846)
@@ -41,4 +41,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.StringProperty;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -312,5 +313,5 @@
         stopRemoteControlHttpsServer();
         if (RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.get()) {
-            int port = Main.pref.getInt("remote.control.https.port", HTTPS_PORT);
+            int port = Config.getPref().getInt("remote.control.https.port", HTTPS_PORT);
             try {
                 instance4 = new RemoteControlHttpsServer(port, false);
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 12846)
@@ -8,5 +8,4 @@
 import java.util.Map;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.command.AddCommand;
@@ -20,4 +19,5 @@
 import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -92,5 +92,5 @@
             Point p = mapView.getPoint(ll);
             node = mapView.getNearestNode(p, OsmPrimitive::isUsable);
-            if (node != null && node.getCoor().greatCircleDistance(ll) > Main.pref.getDouble("remotecontrol.tolerance", 0.1)) {
+            if (node != null && node.getCoor().greatCircleDistance(ll) > Config.getPref().getDouble("remotecontrol.tolerance", 0.1)) {
                 node = null; // node is too far
             }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 12846)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -130,5 +131,5 @@
             MapView mapView = MainApplication.getMap().mapView;
             nd = mapView.getNearestNode(mapView.getPoint(ll), OsmPrimitive::isUsable);
-            if (nd != null && nd.getCoor().greatCircleDistance(ll) > Main.pref.getDouble("remote.tolerance", 0.1)) {
+            if (nd != null && nd.getCoor().greatCircleDistance(ll) > Config.getPref().getDouble("remote.tolerance", 0.1)) {
                 nd = null; // node is too far
             }
@@ -138,5 +139,5 @@
         for (Entry<LatLon, Node> entry : addedNodes.entrySet()) {
             LatLon lOld = entry.getKey();
-            if (lOld.greatCircleDistance(ll) < Main.pref.getDouble("remotecontrol.tolerance", 0.1)) {
+            if (lOld.greatCircleDistance(ll) < Config.getPref().getDouble("remotecontrol.tolerance", 0.1)) {
                 prev = entry.getValue();
                 break;
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 12846)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -40,5 +41,5 @@
                 Logging.debug("Remote control, /import: defaulting to DownloadOsmTask");
                 new DownloadOsmTask().loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
-            } else if (Main.pref.getBoolean("remotecontrol.import.interactive", true)) {
+            } else if (Config.getPref().getBoolean("remotecontrol.import.interactive", true)) {
                 // OpenLocationAction queries the user if more than one task is suitable
                 MainApplication.getMenu().openLocation.openUrl(isLoadInNewLayer(), url.toExternalForm());
@@ -101,5 +102,5 @@
     protected void validateRequest() throws RequestHandlerBadRequestException {
         String urlString = args != null ? args.get("url") : null;
-        if (Main.pref.getBoolean("remotecontrol.importhandler.fix_url_query", true)) {
+        if (Config.getPref().getBoolean("remotecontrol.importhandler.fix_url_query", true)) {
             urlString = Utils.fixURLQuery(urlString);
         }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 12846)
@@ -23,6 +23,6 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchParseError;
-import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MainApplication;
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 12846)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -147,5 +148,5 @@
          */
         PermissionPrefWithDefault permissionPref = getPermissionPref();
-        if (permissionPref != null && permissionPref.pref != null && !Main.pref.getBoolean(permissionPref.pref, permissionPref.defaultVal)) {
+        if (permissionPref != null && permissionPref.pref != null && !Config.getPref().getBoolean(permissionPref.pref, permissionPref.defaultVal)) {
             String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by preferences", myCommand);
             Logging.info(err);
@@ -156,5 +157,5 @@
          * If yes, display specific confirmation message.
          */
-        if (Main.pref.getBoolean(globalConfirmationKey, globalConfirmationDefault)) {
+        if (Config.getPref().getBoolean(globalConfirmationKey, globalConfirmationDefault)) {
             // Ensure dialog box does not exceed main window size
             Integer maxWidth = (int) Math.max(200, Main.parent.getWidth()*0.6);
@@ -276,5 +277,5 @@
         return args.get("new_layer") != null && !args.get("new_layer").isEmpty()
                 ? Boolean.parseBoolean(args.get("new_layer"))
-                : Main.pref.getBoolean(loadInNewLayerKey, loadInNewLayerDefault);
+                : Config.getPref().getBoolean(loadInNewLayerKey, loadInNewLayerDefault);
     }
 
Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12846)
@@ -67,4 +67,5 @@
 import org.openstreetmap.josm.io.OfflineAccessException;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.I18n;
@@ -422,5 +423,5 @@
         String togglePreferenceKey = null;
         int v = Version.getInstance().getVersion();
-        if (Main.pref.getInt("pluginmanager.version", 0) < v) {
+        if (Config.getPref().getInt("pluginmanager.version", 0) < v) {
             message =
                 "<html>"
@@ -434,8 +435,8 @@
             long tim = System.currentTimeMillis();
             long last = Main.pref.getLong("pluginmanager.lastupdate", 0);
-            Integer maxTime = Main.pref.getInt("pluginmanager.time-based-update.interval", DEFAULT_TIME_BASED_UPDATE_INTERVAL);
+            Integer maxTime = Config.getPref().getInt("pluginmanager.time-based-update.interval", DEFAULT_TIME_BASED_UPDATE_INTERVAL);
             long d = TimeUnit.MILLISECONDS.toDays(tim - last);
             if ((last <= 0) || (maxTime <= 0)) {
-                Main.pref.put("pluginmanager.lastupdate", Long.toString(tim));
+                Config.getPref().put("pluginmanager.lastupdate", Long.toString(tim));
             } else if (d > maxTime) {
                 message =
@@ -454,5 +455,5 @@
         // check whether automatic update at startup was disabled
         //
-        String policy = Main.pref.get(togglePreferenceKey, "ask").trim().toLowerCase(Locale.ENGLISH);
+        String policy = Config.getPref().get(togglePreferenceKey, "ask").trim().toLowerCase(Locale.ENGLISH);
         switch(policy) {
         case "never":
@@ -508,14 +509,14 @@
             switch(ret) {
             case 0:
-                Main.pref.put(togglePreferenceKey, "always");
+                Config.getPref().put(togglePreferenceKey, "always");
                 break;
             case JOptionPane.CLOSED_OPTION:
             case 1:
-                Main.pref.put(togglePreferenceKey, "never");
+                Config.getPref().put(togglePreferenceKey, "never");
                 break;
             default: // Do nothing
             }
         } else {
-            Main.pref.put(togglePreferenceKey, "ask");
+            Config.getPref().put(togglePreferenceKey, "ask");
         }
         return ret == 0;
@@ -607,9 +608,9 @@
                     if (!task.getDownloadedPlugins().isEmpty()) {
                         // update plugin list in preferences
-                        Set<String> plugins = new HashSet<>(Main.pref.getList("plugins"));
+                        Set<String> plugins = new HashSet<>(Config.getPref().getList("plugins"));
                         for (PluginInformation plugin : task.getDownloadedPlugins()) {
                             plugins.add(plugin.name);
                         }
-                        Main.pref.putList("plugins", new ArrayList<>(plugins));
+                        Config.getPref().putList("plugins", new ArrayList<>(plugins));
                         // restart
                         try {
@@ -969,5 +970,5 @@
         try {
             monitor.beginTask(tr("Determining plugins to load..."));
-            Set<String> plugins = new HashSet<>(Main.pref.getList("plugins", new LinkedList<String>()));
+            Set<String> plugins = new HashSet<>(Config.getPref().getList("plugins", new LinkedList<String>()));
             Logging.debug("Plugins list initialized to {0}", plugins);
             String systemProp = System.getProperty("josm.plugins");
@@ -1157,6 +1158,6 @@
         if (pluginsWanted == null) {
             // if all plugins updated, remember the update because it was successful
-            Main.pref.putInt("pluginmanager.version", Version.getInstance().getVersion());
-            Main.pref.put("pluginmanager.lastupdate", Long.toString(System.currentTimeMillis()));
+            Config.getPref().putInt("pluginmanager.version", Version.getInstance().getVersion());
+            Config.getPref().put("pluginmanager.lastupdate", Long.toString(System.currentTimeMillis()));
         }
         return plugins;
@@ -1450,5 +1451,5 @@
             return null;
 
-        Set<String> plugins = new HashSet<>(Main.pref.getList("plugins"));
+        Set<String> plugins = new HashSet<>(Config.getPref().getList("plugins"));
         final PluginInformation pluginInfo = plugin.getPluginInformation();
         if (!plugins.contains(pluginInfo.name))
@@ -1465,5 +1466,5 @@
             // deactivate the plugin
             plugins.remove(plugin.getPluginInformation().name);
-            Main.pref.putList("plugins", new ArrayList<>(plugins));
+            Config.getPref().putList("plugins", new ArrayList<>(plugins));
             GuiHelper.runInEDTAndWait(() -> JOptionPane.showMessageDialog(
                     Main.parent,
@@ -1484,5 +1485,5 @@
      */
     public static Collection<String> getBugReportInformation() {
-        final Collection<String> pl = new TreeSet<>(Main.pref.getList("plugins", new LinkedList<>()));
+        final Collection<String> pl = new TreeSet<>(Config.getPref().getList("plugins", new LinkedList<>()));
         for (final PluginProxy pp : pluginList) {
             PluginInformation pi = pp.getPluginInformation();
@@ -1569,5 +1570,5 @@
 
         public void initDontShowAgain(String preferencesKey) {
-            String policy = Main.pref.get(preferencesKey, "ask");
+            String policy = Config.getPref().get(preferencesKey, "ask");
             policy = policy.trim().toLowerCase(Locale.ENGLISH);
             cbDontShowAgain.setSelected(!"ask".equals(policy));
Index: trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 12846)
@@ -38,4 +38,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.HttpClient;
@@ -143,5 +144,5 @@
     protected String downloadPluginList(String site, final ProgressMonitor monitor) {
         /* replace %<x> with empty string or x=plugins (separated with comma) */
-        String pl = Utils.join(",", Main.pref.getList("plugins"));
+        String pl = Utils.join(",", Config.getPref().getList("plugins"));
         String printsite = site.replaceAll("%<(.*)>", "");
         if (pl != null && !pl.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/tools/GuiSizesHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/GuiSizesHelper.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/GuiSizesHelper.java	(revision 12846)
@@ -6,5 +6,5 @@
 import java.awt.Toolkit;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -32,5 +32,5 @@
             synchronized (GuiSizesHelper.class) {
                 if (screenDPI == -1) {
-                    float scalePref = (float) Main.pref.getDouble("gui.scale", 1.0);
+                    float scalePref = (float) Config.getPref().getDouble("gui.scale", 1.0);
                     if (scalePref != 0) {
                         screenDPI = 96f * scalePref;
Index: trunk/src/org/openstreetmap/josm/tools/HttpClient.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 12846)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.io.UTFInputStreamReader;
 import org.openstreetmap.josm.io.auth.DefaultAuthenticator;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -45,10 +46,10 @@
     private URL url;
     private final String requestMethod;
-    private int connectTimeout = (int) TimeUnit.SECONDS.toMillis(Main.pref.getInt("socket.timeout.connect", 15));
-    private int readTimeout = (int) TimeUnit.SECONDS.toMillis(Main.pref.getInt("socket.timeout.read", 30));
+    private int connectTimeout = (int) TimeUnit.SECONDS.toMillis(Config.getPref().getInt("socket.timeout.connect", 15));
+    private int readTimeout = (int) TimeUnit.SECONDS.toMillis(Config.getPref().getInt("socket.timeout.read", 30));
     private byte[] requestBody;
     private long ifModifiedSince;
     private final Map<String, String> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-    private int maxRedirects = Main.pref.getInt("socket.maxredirects", 5);
+    private int maxRedirects = Config.getPref().getInt("socket.maxredirects", 5);
     private boolean useCache;
     private String reasonForRequest;
Index: trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 12846)
@@ -72,4 +72,5 @@
 import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.plugins.PluginHandler;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -122,13 +123,13 @@
     public enum ImageSizes {
         /** SMALL_ICON value of an Action */
-        SMALLICON(Main.pref.getInt("iconsize.smallicon", 16)),
+        SMALLICON(Config.getPref().getInt("iconsize.smallicon", 16)),
         /** LARGE_ICON_KEY value of an Action */
-        LARGEICON(Main.pref.getInt("iconsize.largeicon", 24)),
+        LARGEICON(Config.getPref().getInt("iconsize.largeicon", 24)),
         /** map icon */
-        MAP(Main.pref.getInt("iconsize.map", 16)),
+        MAP(Config.getPref().getInt("iconsize.map", 16)),
         /** map icon maximum size */
-        MAPMAX(Main.pref.getInt("iconsize.mapmax", 48)),
+        MAPMAX(Config.getPref().getInt("iconsize.mapmax", 48)),
         /** cursor icon size */
-        CURSOR(Main.pref.getInt("iconsize.cursor", 32)),
+        CURSOR(Config.getPref().getInt("iconsize.cursor", 32)),
         /** cursor overlay icon size */
         CURSOROVERLAY(CURSOR),
@@ -142,5 +143,5 @@
          * @since 8323
          */
-        LAYER(Main.pref.getInt("iconsize.layer", 16)),
+        LAYER(Config.getPref().getInt("iconsize.layer", 16)),
         /** Toolbar button icon size
          * @since 9253
@@ -150,14 +151,14 @@
          * @since 9253
          */
-        SIDEBUTTON(Main.pref.getInt("iconsize.sidebutton", 20)),
+        SIDEBUTTON(Config.getPref().getInt("iconsize.sidebutton", 20)),
         /** Settings tab icon size
          * @since 9253
          */
-        SETTINGS_TAB(Main.pref.getInt("iconsize.settingstab", 48)),
+        SETTINGS_TAB(Config.getPref().getInt("iconsize.settingstab", 48)),
         /**
          * The default image size
          * @since 9705
          */
-        DEFAULT(Main.pref.getInt("iconsize.default", 24)),
+        DEFAULT(Config.getPref().getInt("iconsize.default", 24)),
         /**
          * Splash dialog logo size
@@ -1018,5 +1019,5 @@
                 "https://wiki.openstreetmap.org/wiki/File:"
                 );
-        final Collection<String> baseUrls = Main.pref.getList("image-provider.wiki.urls", defaultBaseUrls);
+        final Collection<String> baseUrls = Config.getPref().getList("image-provider.wiki.urls", defaultBaseUrls);
 
         final String fn = name.substring(name.lastIndexOf('/') + 1);
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 12846)
@@ -19,7 +19,7 @@
 import java.util.List;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.projection.datum.NTV2Proj4DirGridShiftFileSource;
 import org.openstreetmap.josm.io.CertificateAmendment.CertAmend;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -314,5 +314,5 @@
             String version = Utils.getJavaLatestVersion();
             callback.askUpdateJava(version != null ? version : "latest",
-                    Main.pref.get("java.update.url", "https://www.java.com/download"),
+                    Config.getPref().get("java.update.url", "https://www.java.com/download"),
                     DateUtils.getDateFormat(DateFormat.MEDIUM).format(expiration), false);
         }
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 12846)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.CertificateAmendment.CertAmend;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -51,5 +52,5 @@
     @Override
     public void openUrl(String url) throws IOException {
-        for (String program : Main.pref.getList("browser.unix",
+        for (String program : Config.getPref().getList("browser.unix",
                 Arrays.asList("xdg-open", "#DESKTOP#", "$BROWSER", "gnome-open", "kfmclient openURL", "firefox"))) {
             try {
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 12846)
@@ -69,4 +69,5 @@
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.io.CertificateAmendment.CertAmend;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -501,10 +502,10 @@
      */
     protected void extendFontconfig(String templateFileName) {
-        String customFontconfigFile = Main.pref.get("fontconfig.properties", null);
+        String customFontconfigFile = Config.getPref().get("fontconfig.properties", null);
         if (customFontconfigFile != null) {
             Utils.updateSystemProperty("sun.awt.fontconfig", customFontconfigFile);
             return;
         }
-        if (!Main.pref.getBoolean("font.extended-unicode", true))
+        if (!Config.getPref().getBoolean("font.extended-unicode", true))
             return;
 
Index: trunk/src/org/openstreetmap/josm/tools/Shortcut.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 12846)
@@ -23,4 +23,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -170,5 +171,5 @@
     // create a shortcut object from an string as saved in the preferences
     private Shortcut(String prefString) {
-        List<String> s = new ArrayList<>(Main.pref.getList(prefString));
+        List<String> s = new ArrayList<>(Config.getPref().getList(prefString));
         this.shortText = prefString.substring(15);
         this.longText = s.get(0);
@@ -182,5 +183,5 @@
 
     private void saveDefault() {
-        Main.pref.getList("shortcut.entry."+shortText, Arrays.asList(longText,
+        Config.getPref().getList("shortcut.entry."+shortText, Arrays.asList(longText,
             String.valueOf(requestedKey), String.valueOf(requestedGroup), String.valueOf(requestedKey),
             String.valueOf(getGroupModifier(requestedGroup)), String.valueOf(true), String.valueOf(false)));
@@ -190,7 +191,7 @@
     private boolean save() {
         if (isAutomatic() || isReset() || !isAssignedUser()) {
-            return Main.pref.putList("shortcut.entry."+shortText, null);
+            return Config.getPref().putList("shortcut.entry."+shortText, null);
         } else {
-            return Main.pref.putList("shortcut.entry."+shortText, Arrays.asList(longText,
+            return Config.getPref().putList("shortcut.entry."+shortText, Arrays.asList(longText,
                 String.valueOf(requestedKey), String.valueOf(requestedGroup), String.valueOf(assignedKey),
                 String.valueOf(assignedModifier), String.valueOf(assignedDefault), String.valueOf(assignedUser)));
Index: trunk/src/org/openstreetmap/josm/tools/TextTagParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/TextTagParser.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/TextTagParser.java	(revision 12846)
@@ -12,5 +12,5 @@
 import java.util.regex.Pattern;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -20,7 +20,7 @@
 
     // properties need JOSM restart to apply, modified rarely enough
-    private static final int MAX_KEY_LENGTH = Main.pref.getInt("tags.paste.max-key-length", 50);
-    private static final int MAX_KEY_COUNT = Main.pref.getInt("tags.paste.max-key-count", 30);
-    private static final String KEY_PATTERN = Main.pref.get("tags.paste.tag-pattern", "[0-9a-zA-Z:_]*");
+    private static final int MAX_KEY_LENGTH = Config.getPref().getInt("tags.paste.max-key-length", 50);
+    private static final int MAX_KEY_COUNT = Config.getPref().getInt("tags.paste.max-key-count", 30);
+    private static final String KEY_PATTERN = Config.getPref().get("tags.paste.tag-pattern", "[0-9a-zA-Z:_]*");
     private static final int MAX_VALUE_LENGTH = 255;
 
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 12846)
@@ -70,6 +70,6 @@
 
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.Compression;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
@@ -1246,5 +1246,5 @@
      */
     public static ForkJoinPool newForkJoinPool(String pref, final String nameFormat, final int threadPriority) {
-        int noThreads = Main.pref.getInt(pref, Runtime.getRuntime().availableProcessors());
+        int noThreads = Config.getPref().getInt(pref, Runtime.getRuntime().availableProcessors());
         return new ForkJoinPool(noThreads, new ForkJoinPool.ForkJoinWorkerThreadFactory() {
             final AtomicLong count = new AtomicLong(0);
@@ -1686,6 +1686,5 @@
     public static String getJavaLatestVersion() {
         try {
-            return HttpClient.create(
-                    new URL(Main.pref.get("java.baseline.version.url", "http://javadl-esd-secure.oracle.com/update/baseline.version")))
+            return HttpClient.create(new URL(Config.getPref().get("java.baseline.version.url", "http://javadl-esd-secure.oracle.com/update/baseline.version")))
                     .connect().fetchContent().split("\n")[0];
         } catch (IOException e) {
Index: trunk/src/org/openstreetmap/josm/tools/WikiReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/WikiReader.java	(revision 12845)
+++ trunk/src/org/openstreetmap/josm/tools/WikiReader.java	(revision 12846)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.LanguageInfo.LocaleType;
 
@@ -30,5 +31,5 @@
      */
     public WikiReader() {
-        this(Main.pref.get("help.baseurl", Main.getJOSMWebsite()));
+        this(Config.getPref().get("help.baseurl", Main.getJOSMWebsite()));
     }
 
