Index: src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java	(revision 1979)
+++ src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java	(working copy)
@@ -3,16 +3,8 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.Font;
-
-import javax.swing.JLabel;
-import javax.swing.JPasswordField;
-import javax.swing.JTextField;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.io.OsmConnection;
-import org.openstreetmap.josm.io.CredentialsManager.PreferenceAdditions;
+import org.openstreetmap.josm.io.CredentialsManager;
 
 public class ServerAccessPreference implements PreferenceSetting {
 
@@ -23,25 +15,16 @@
     }
 
     /**
-     * Editfield for the Base url to the REST API from OSM.
-     */
-    private JTextField osmDataServer = new JTextField(20);
-    /**
      * Provide username and password input editfields.
      * Store the values if user hits OK.
      */
-    private PreferenceAdditions credentialsPA = OsmConnection.credentialsManager.newPreferenceAdditions();
+    private CredentialsManager.PreferenceAdditions credentialsPA = OsmConnection.credentialsManager.newPreferenceAdditions();
 
     public void addGui(PreferenceDialog gui) {
-        osmDataServer.setText(Main.pref.get("osm-server.url", "http://api.openstreetmap.org/api"));
-        osmDataServer.setToolTipText(tr("The base URL for the OSM server (REST API)"));
-        gui.connection.add(new JLabel(tr("Base Server URL")), GBC.std());
-        gui.connection.add(osmDataServer, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
         credentialsPA.addPreferenceOptions(gui.connection);
     }
 
     public boolean ok() {
-        Main.pref.put("osm-server.url", osmDataServer.getText());
         credentialsPA.preferencesChanged();
         return false;
     }
Index: src/org/openstreetmap/josm/io/CredentialsManager.java
===================================================================
--- src/org/openstreetmap/josm/io/CredentialsManager.java	(revision 1979)
+++ src/org/openstreetmap/josm/io/CredentialsManager.java	(working copy)
@@ -8,21 +8,28 @@
  * username/password-related user interaction is encapsulated here.
  */
 public interface CredentialsManager {
+    enum Key {
+        OSM_SERVER_URL("url"), 
+        USERNAME("username"), 
+        PASSWORD("password");
+        final private String pname;
+        private Key(String name) {
+            pname = name;
+        }
+        @Override public String toString() {
+            return pname;
+        }
+    };
+    
     /**
-     * lookupUsername, lookupPassword:
-     *
      * Should throw or return non-null, possibly empty String.
      */
-    public String lookupUsername() throws CMException;
-    public String lookupPassword() throws CMException;
+    public String lookup(Key key) throws CMException;
 
     /**
-     * storeUsername, storePassword:
-     *
      * May silently fail to store.
      */
-    public void storeUsername(String username) throws CMException;
-    public void storePassword(String password) throws CMException;
+    public void store(Key key, String secret) throws CMException;
 
     /**
      * If authentication using the stored credentials fails, this method is
Index: src/org/openstreetmap/josm/io/OsmConnection.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmConnection.java	(revision 1979)
+++ src/org/openstreetmap/josm/io/OsmConnection.java	(working copy)
@@ -111,7 +111,8 @@
         String auth;
         try {
             synchronized (credentialsManager) {
-                auth = credentialsManager.lookupUsername() + ":" + credentialsManager.lookupPassword();
+                auth = credentialsManager.lookup(CredentialsManager.Key.USERNAME) + ":" + 
+                    credentialsManager.lookup(CredentialsManager.Key.PASSWORD);
             }
         } catch (CredentialsManager.CMException e) {
             auth = ":";
@@ -129,33 +130,28 @@
     public boolean isCanceled() {
         return cancel;
     }
-
+    /**
+     * Default implementation of the CredentialsManager interface.
+     * Saves passwords in plain text file.
+     */
     public static class PlainCredentialsManager implements CredentialsManager {
-        public String lookupUsername() throws CMException {
-            String username = Main.pref.get("osm-server.username", null);
-            if (username == null) throw new CredentialsManager.NoContentException();
-            return username;
+        public String lookup(CredentialsManager.Key key) throws CMException {
+            String secret = Main.pref.get("osm-server." + key.toString(), null);
+            if (secret == null) throw new CredentialsManager.NoContentException();
+            return secret;            
         }
-        public String lookupPassword() throws CMException {
-            String password = Main.pref.get("osm-server.password");
-            if (password == null) throw new CredentialsManager.NoContentException();
-            return password;
+        public void store(CredentialsManager.Key key, String secret) {
+            Main.pref.put("osm-server." + key.toString(), secret);
         }
-        public void storeUsername(String username) {
-            Main.pref.put("osm-server.username", username);
-        }
-        public void storePassword(String password) {
-            Main.pref.put("osm-server.password", password);
-        }
         public PasswordAuthentication getPasswordAuthentication(OsmAuth caller) {
             String username, password;
             try {
-                username = lookupUsername();
+                username = lookup(Key.USERNAME);
             } catch (CMException e) {
                 username = "";
             }
             try {
-                password = lookupPassword();
+                password = lookup(Key.PASSWORD);
             } catch (CMException e) {
                 password = "";
             }
@@ -174,14 +170,16 @@
                 warning.setFont(warning.getFont().deriveFont(Font.ITALIC));
                 p.add(warning, GBC.eop());
 
-                JCheckBox savePassword = new JCheckBox(tr("Save user and password (unencrypted)"), !username.equals("") && !password.equals(""));
+                JCheckBox savePassword = new JCheckBox(tr("Save user and password (unencrypted)"), 
+                                                       !username.equals("") && !password.equals(""));
                 p.add(savePassword, GBC.eop());
 
-                int choice = new ExtendedDialog(Main.parent,
-                        tr("Enter Password"),
-                        p,
-                        new String[] {tr("Login"), tr("Cancel")},
-                        new String[] {"ok.png", "cancel.png"}).getValue();
+                int choice = new ExtendedDialog(
+                    Main.parent,
+                    tr("Enter Password"),
+                    p,
+                    new String[] {tr("Login"), tr("Cancel")},
+                    new String[] {"ok.png", "cancel.png"}).getValue();
 
                 if (choice != 1) {
                     caller.authCancelled = true;
@@ -190,8 +188,8 @@
                 username = usernameField.getText();
                 password = String.valueOf(passwordField.getPassword());
                 if (savePassword.isSelected()) {
-                    storeUsername(username);
-                    storePassword(password);
+                    store(Key.USERNAME, username);
+                    store(Key.PASSWORD, password);
                 }
                 if (username.equals(""))
                     return null;
@@ -202,32 +200,47 @@
         public PreferenceAdditions newPreferenceAdditions() {
             return new PreferenceAdditions() {
                 /**
+                 * Editfield for the Base url to the REST API from OSM.
+                 */
+                final private JTextField osmDataServerURL = new JTextField(20);
+                /**
                  * Editfield for the username to the OSM account.
                  */
-                private JTextField osmDataUsername = new JTextField(20);
+                final private JTextField osmDataUsername = new JTextField(20);
                 /**
                  * Passwordfield for the userpassword of the REST API.
                  */
-                private JPasswordField osmDataPassword = new JPasswordField(20);
+                final private JPasswordField osmDataPassword = new JPasswordField(20);
 
+                private String oldServerURL = "";
                 private String oldUsername = "";
                 private String oldPassword = "";
 
                 public void addPreferenceOptions(JPanel panel) {
                     try {
-                        oldUsername = lookupUsername();
+                        oldServerURL = lookup(Key.OSM_SERVER_URL); // result is not null (see CredentialsManager)
                     } catch (CMException e) {
+                        oldServerURL = "";
+                    }
+                    if (oldServerURL.equals("")) oldServerURL = "http://api.openstreetmap.org/api";
+                    try {
+                        oldUsername = lookup(Key.USERNAME);
+                    } catch (CMException e) {
                         oldUsername = "";
                     }
                     try {
-                        oldPassword = lookupPassword();
+                        oldPassword = lookup(Key.PASSWORD);
                     } catch (CMException e) {
                         oldPassword = "";
                     }
+                    osmDataServerURL.setText(oldServerURL);
                     osmDataUsername.setText(oldUsername);
                     osmDataPassword.setText(oldPassword);
+                    osmDataServerURL.setToolTipText(tr("The base URL for the OSM server (REST API)"));
                     osmDataUsername.setToolTipText(tr("Login name (e-mail) to the OSM account."));
                     osmDataPassword.setToolTipText(tr("Login password to the OSM account. Leave blank to not store any password."));
+                    panel.add(new JLabel(tr("Base Server URL")), GBC.std());
+                    panel.add(osmDataServerURL, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
                     panel.add(new JLabel(tr("OSM username (e-mail)")), GBC.std());
                     panel.add(osmDataUsername, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
                     panel.add(new JLabel(tr("OSM password")), GBC.std());
@@ -240,13 +253,17 @@
                     panel.add(warning, GBC.eop().fill(GBC.HORIZONTAL));
                 }
                 public void preferencesChanged() {
+                    String newServerURL = osmDataServerURL.getText();
                     String newUsername = osmDataUsername.getText();
                     String newPassword = String.valueOf(osmDataPassword.getPassword());
+                    if (!oldServerURL.equals(newServerURL)) {
+                        store(Key.OSM_SERVER_URL, newServerURL); 
+                    }
                     if (!oldUsername.equals(newUsername)) {
-                        storeUsername(newUsername);
+                        store(Key.USERNAME, newUsername);
                     }
                     if (!oldPassword.equals(newPassword)) {
-                        storePassword(newPassword);
+                        store(Key.PASSWORD, newPassword);
                     }
                 }
             };
