Index: /applications/editors/josm/plugins/native-password-manager/build.xml
===================================================================
--- /applications/editors/josm/plugins/native-password-manager/build.xml	(revision 34471)
+++ /applications/editors/josm/plugins/native-password-manager/build.xml	(revision 34472)
@@ -5,5 +5,5 @@
     <property name="commit.message" value="Commit message"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="12805"/>
+    <property name="plugin.main.version" value="14153"/>
     <property name="plugin.author" value="Paul Hartmann"/>
     <property name="plugin.class" value="org.openstreetmap.josm.plugins.npm.NPMPlugin"/>
Index: /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/InitializationWizard.java
===================================================================
--- /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/InitializationWizard.java	(revision 34471)
+++ /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/InitializationWizard.java	(revision 34472)
@@ -41,6 +41,6 @@
 
 import org.netbeans.spi.keyring.KeyringProvider;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
@@ -49,8 +49,8 @@
 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.ImageProvider;
-import org.openstreetmap.josm.tools.PlatformHookOsx;
-import org.openstreetmap.josm.tools.PlatformHookUnixoid;
-import org.openstreetmap.josm.tools.PlatformHookWindows;
+import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.PlatformManager;
 
 public class InitializationWizard extends JDialog {
@@ -67,5 +67,5 @@
     
     public InitializationWizard() {
-        super(JOptionPane.getFrameForComponent(Main.parent), tr("Native password manager plugin"), ModalityType.DOCUMENT_MODAL);
+        super(JOptionPane.getFrameForComponent(MainApplication.getMainFrame()), tr("Native password manager plugin"), ModalityType.DOCUMENT_MODAL);
         build();
         NPMType npm = detectNativePasswordManager();
@@ -351,12 +351,12 @@
             CredentialsManager cm = CredentialsManager.getInstance();
             
-            String server_username = Main.pref.get("osm-server.username", null);
-            String server_password = Main.pref.get("osm-server.password", null);
+            String server_username = Config.getPref().get("osm-server.username", null);
+            String server_password = Config.getPref().get("osm-server.password", null);
             if (server_username != null || server_password != null) {
                 try {
                     cm.store(RequestorType.SERVER, OsmApi.getOsmApi().getHost(), new PasswordAuthentication(string(server_username), toCharArray(server_password)));
                     if (rbClear.isSelected()) {
-                        Main.pref.put("osm-server.username", null);
-                        Main.pref.put("osm-server.password", null);
+                        Config.getPref().put("osm-server.username", null);
+                        Config.getPref().put("osm-server.password", null);
                     }
                 } catch (CredentialsAgentException ex) {
@@ -365,13 +365,13 @@
             }
             
-            String proxy_username = Main.pref.get(DefaultProxySelector.PROXY_USER, null);
-            String proxy_password = Main.pref.get(DefaultProxySelector.PROXY_PASS, null);
-            String proxy_host = Main.pref.get(DefaultProxySelector.PROXY_HTTP_HOST, null);
+            String proxy_username = Config.getPref().get(DefaultProxySelector.PROXY_USER, null);
+            String proxy_password = Config.getPref().get(DefaultProxySelector.PROXY_PASS, null);
+            String proxy_host = Config.getPref().get(DefaultProxySelector.PROXY_HTTP_HOST, null);
             if (proxy_username != null || proxy_password != null) {
                 try {
                     cm.store(RequestorType.PROXY, proxy_host, new PasswordAuthentication(string(proxy_username), toCharArray(proxy_password)));
                     if (rbClear.isSelected()) {
-                        Main.pref.put(DefaultProxySelector.PROXY_USER, null);
-                        Main.pref.put(DefaultProxySelector.PROXY_PASS, null);
+                        Config.getPref().put(DefaultProxySelector.PROXY_USER, null);
+                        Config.getPref().put(DefaultProxySelector.PROXY_PASS, null);
                     }
                 } catch (CredentialsAgentException ex) {
@@ -380,12 +380,12 @@
             }
             
-            String oauth_key = Main.pref.get("oauth.access-token.key", null);
-            String oauth_secret = Main.pref.get("oauth.access-token.secret", null);
+            String oauth_key = Config.getPref().get("oauth.access-token.key", null);
+            String oauth_secret = Config.getPref().get("oauth.access-token.secret", null);
             if (oauth_key != null || oauth_secret != null) {
                 try {
                     cm.storeOAuthAccessToken(new OAuthToken(string(oauth_key), string(oauth_secret)));
                     if (rbClear.isSelected()) {
-                        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);
                     }
                 } catch (CredentialsAgentException ex) {
@@ -400,19 +400,18 @@
     private static NPMType detectNativePasswordManager() {
         NPMType[] potentialManagers;
-        
-        if (Main.platform instanceof PlatformHookWindows) {
+        if (PlatformManager.isPlatformWindows()) {
             potentialManagers = new NPMType[] { NPMType.CRYPT32 };
-        } else if (Main.platform instanceof PlatformHookOsx) {
+        } else if (PlatformManager.isPlatformOsx()) {
             potentialManagers = new NPMType[] { NPMType.KEYCHAIN };
-        } else if (Main.platform instanceof PlatformHookUnixoid) {
+        } else if (PlatformManager.isPlatformUnixoid()) {
             potentialManagers = new NPMType[] { NPMType.GNOME_KEYRING, NPMType.KWALLET };
         } else
             throw new AssertionError();
-            
+
         for (NPMType manager : potentialManagers) {
-            System.out.println(NPM + "Looking for " + manager.getName());
+            Logging.info(NPM + "Looking for " + manager.getName());
             KeyringProvider provider = manager.getProvider();
             if (provider.enabled()) {
-                System.out.println(NPM + "Found " + manager.getName());
+                Logging.info(NPM + "Found " + manager.getName());
                 return manager;
             }
@@ -423,10 +422,10 @@
     private static boolean hasUnprotectedCedentials() {
         return 
-            Main.pref.get("osm-server.username", null) != null ||
-            Main.pref.get("osm-server.password", null) != null ||
-            Main.pref.get(DefaultProxySelector.PROXY_USER, null) != null ||
-            Main.pref.get(DefaultProxySelector.PROXY_PASS, null) != null ||
-            Main.pref.get("oauth.access-token.key", null) != null ||
-            Main.pref.get("oauth.access-token.secret", null) != null;
+            Config.getPref().get("osm-server.username", null) != null ||
+            Config.getPref().get("osm-server.password", null) != null ||
+            Config.getPref().get(DefaultProxySelector.PROXY_USER, null) != null ||
+            Config.getPref().get(DefaultProxySelector.PROXY_PASS, null) != null ||
+            Config.getPref().get("oauth.access-token.key", null) != null ||
+            Config.getPref().get("oauth.access-token.secret", null) != null;
     }
     
Index: /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMCredentialsAgent.java
===================================================================
--- /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMCredentialsAgent.java	(revision 34471)
+++ /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMCredentialsAgent.java	(revision 34472)
@@ -16,5 +16,5 @@
 
 import org.netbeans.spi.keyring.KeyringProvider;
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.io.auth.AbstractCredentialsAgent;
 import org.openstreetmap.josm.io.auth.CredentialsAgentException;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -54,9 +55,9 @@
     
     protected String getServerDescriptor() {
-        String pref = Main.pref.getPreferenceFile().getAbsolutePath();
-        
-        String url =  Main.pref.get("osm-server.url", null);
+        String pref = Preferences.main().getPreferenceFile().getAbsolutePath();
+        
+        String url =  Config.getPref().get("osm-server.url", null);
         if (url == null) {
-            url = OsmApi.DEFAULT_API_URL;
+            url = Config.getUrls().getDefaultOsmApiUrl();
         }
         
@@ -70,7 +71,7 @@
     
     protected String getProxyDescriptor() {
-        String pref = Main.pref.getPreferenceFile().getAbsolutePath();
-        String host = Main.pref.get(DefaultProxySelector.PROXY_HTTP_HOST, "");
-        String port = Main.pref.get(DefaultProxySelector.PROXY_HTTP_PORT, "");
+        String pref = Preferences.main().getPreferenceFile().getAbsolutePath();
+        String host = Config.getPref().get(DefaultProxySelector.PROXY_HTTP_HOST, "");
+        String port = Config.getPref().get(DefaultProxySelector.PROXY_HTTP_PORT, "");
         
         CRC32 id = new CRC32();
@@ -83,5 +84,5 @@
     
     protected String getOAuthDescriptor() {
-        String pref = Main.pref.getPreferenceFile().getAbsolutePath();
+        String pref = Preferences.main().getPreferenceFile().getAbsolutePath();
         // TODO: put more identifying data here
         
@@ -224,20 +225,20 @@
         );
         List<String> sensitive = new ArrayList<>();
-        if (Main.pref.get("osm-server.username", null) != null) {
+        if (Config.getPref().get("osm-server.username", null) != null) {
             sensitive.add(tr("username"));
         }
-        if (Main.pref.get("osm-server.password", null) != null) {
+        if (Config.getPref().get("osm-server.password", null) != null) {
             sensitive.add(tr("password"));
         }
-        if (Main.pref.get(DefaultProxySelector.PROXY_USER, null) != null) {
+        if (Config.getPref().get(DefaultProxySelector.PROXY_USER, null) != null) {
             sensitive.add(tr("proxy username"));
         }
-        if (Main.pref.get(DefaultProxySelector.PROXY_PASS, null) != null) {
+        if (Config.getPref().get(DefaultProxySelector.PROXY_PASS, null) != null) {
             sensitive.add(tr("proxy password"));
         }
-        if (Main.pref.get("oauth.access-token.key", null) != null) {
+        if (Config.getPref().get("oauth.access-token.key", null) != null) {
             sensitive.add(tr("oauth key"));
         }
-        if (Main.pref.get("oauth.access-token.secret", null) != null) {
+        if (Config.getPref().get("oauth.access-token.secret", null) != null) {
             sensitive.add(tr("oauth secret"));
         }
Index: /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMPlugin.java
===================================================================
--- /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMPlugin.java	(revision 34471)
+++ /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMPlugin.java	(revision 34472)
@@ -5,9 +5,9 @@
 
 import javax.swing.SwingUtilities;
-import org.openstreetmap.josm.Main;
+
 import org.openstreetmap.josm.io.auth.CredentialsManager;
-
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 public class NPMPlugin extends Plugin {
@@ -21,5 +21,5 @@
     
     private void initialize() {
-        String pref = Main.pref.get(NPMPLUGIN_KEY+"agent", null);
+        String pref = Config.getPref().get(NPMPLUGIN_KEY+"agent", null);
         if ("off".equals(pref)) return;
         NPMType sel = NPMType.fromPrefString(pref);
@@ -43,9 +43,9 @@
                 new NPMCredentialsAgentFactory(type)
         );
-        Main.pref.put(NPMPLUGIN_KEY+"agent", type.toPrefString());
+        Config.getPref().put(NPMPLUGIN_KEY+"agent", type.toPrefString());
     }
     
     public static void turnOffPermanently() {
-        Main.pref.put(NPMPLUGIN_KEY+"agent", "off");
+        Config.getPref().put(NPMPLUGIN_KEY+"agent", "off");
     }
 }
Index: /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMType.java
===================================================================
--- /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMType.java	(revision 34471)
+++ /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/NPMType.java	(revision 34472)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.npm;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Objects;
@@ -9,6 +11,4 @@
 import org.netbeans.spi.keyring.KeyringProvider;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 public enum NPMType {
Index: /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/Win32Provider.java
===================================================================
--- /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/Win32Provider.java	(revision 34471)
+++ /applications/editors/josm/plugins/native-password-manager/src/org/openstreetmap/josm/plugins/npm/Win32Provider.java	(revision 34472)
@@ -4,5 +4,5 @@
 import org.netbeans.modules.keyring.fallback.FallbackProvider;
 import org.netbeans.modules.keyring.win32.Win32Protect;
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.Config;
 
 public class Win32Provider extends FallbackProvider {
@@ -11,14 +11,14 @@
     
         @Override public byte[] getByteArray(String key, byte[] def) {
-            String p = Main.pref.get(key, null);
+            String p = Config.getPref().get(key, null);
             return p == null ? def : DatatypeConverter._parseBase64Binary(p);
         }
 
         @Override public void putByteArray(String key, byte[] val) {
-            Main.pref.put(key, val == null ? null : DatatypeConverter._printBase64Binary(val));
+            Config.getPref().put(key, val == null ? null : DatatypeConverter._printBase64Binary(val));
         }
 
         @Override public void remove(String key) {
-            Main.pref.put(key, null);
+            Config.getPref().put(key, null);
         }
     }
