Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java	(revision 12743)
@@ -10,6 +10,6 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.UserInfo;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.ChangesetQuery;
@@ -48,5 +48,5 @@
 
             UserInfo info = userInfoReader.fetchUserInfo(getProgressMonitor().createSubTaskMonitor(1, false));
-            JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+            UserIdentityManager im = UserIdentityManager.getInstance();
             im.setFullyIdentified(im.getUserName(), info);
         }
@@ -55,5 +55,5 @@
         protected void realRun() throws SAXException, IOException, OsmTransferException {
             try {
-                JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+                UserIdentityManager im = UserIdentityManager.getInstance();
                 if (query.isRestrictedToPartiallyIdentifiedUser() && im.isCurrentUser(query.getUserName())) {
                     // if we query changesets for the current user, make sure we query against
@@ -63,5 +63,5 @@
                         fullyIdentifyCurrentUser();
                     }
-                    query = query.forUser(JosmUserIdentityManager.getInstance().getUserId());
+                    query = query.forUser(UserIdentityManager.getInstance().getUserId());
                 }
                 if (isCanceled())
Index: trunk/src/org/openstreetmap/josm/data/UserIdentityManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UserIdentityManager.java	(revision 12743)
+++ trunk/src/org/openstreetmap/josm/data/UserIdentityManager.java	(revision 12743)
@@ -0,0 +1,313 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.text.MessageFormat;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.data.oauth.OAuthAccessTokenHolder;
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.data.osm.UserInfo;
+import org.openstreetmap.josm.data.preferences.StringSetting;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmServerUserInfoReader;
+import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.io.auth.CredentialsManager;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.JosmRuntimeException;
+import org.openstreetmap.josm.tools.Logging;
+
+/**
+ * UserIdentityManager is a global object which keeps track of what JOSM knows about
+ * the identity of the current user.
+ *
+ * JOSM can be operated anonymously provided the current user never invokes an operation
+ * on the OSM server which required authentication. In this case JOSM neither knows
+ * the user name of the OSM account of the current user nor its unique id. Perhaps the
+ * user doesn't have one.
+ *
+ * If the current user supplies a user name and a password in the JOSM preferences JOSM
+ * can partially identify the user.
+ *
+ * The current user is fully identified if JOSM knows both the user name and the unique
+ * id of the users OSM account. The latter is retrieved from the OSM server with a
+ * <tt>GET /api/0.6/user/details</tt> request, submitted with the user name and password
+ * of the current user.
+ *
+ * The global UserIdentityManager listens to {@link PreferenceChangeEvent}s and keeps track
+ * of what the current JOSM instance knows about the current user. Other subsystems can
+ * let the global UserIdentityManager know in case they fully identify the current user, see
+ * {@link #setFullyIdentified}.
+ *
+ * The information kept by the UserIdentityManager can be used to
+ * <ul>
+ *   <li>safely query changesets owned by the current user based on its user id, not on its user name</li>
+ *   <li>safely search for objects last touched by the current user based on its user id, not on its user name</li>
+ * </ul>
+ * @since xxx (renamed from {@code org.openstreetmap.josm.gui.JosmUserIdentityManager})
+ * @since 2689 (creation)
+ */
+public final class UserIdentityManager implements PreferenceChangedListener {
+
+    private static UserIdentityManager instance;
+
+    /**
+     * Replies the unique instance of the JOSM user identity manager
+     *
+     * @return the unique instance of the JOSM user identity manager
+     */
+    public static synchronized UserIdentityManager getInstance() {
+        if (instance == null) {
+            instance = new UserIdentityManager();
+            if (OsmApi.isUsingOAuth() && OAuthAccessTokenHolder.getInstance().containsAccessToken() &&
+                    !Main.isOffline(OnlineResource.OSM_API)) {
+                try {
+                    instance.initFromOAuth();
+                } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
+                    Logging.error(e);
+                    // Fall back to preferences if OAuth identification fails for any reason
+                    instance.initFromPreferences();
+                }
+            } else {
+                instance.initFromPreferences();
+            }
+            Main.pref.addPreferenceChangeListener(instance);
+        }
+        return instance;
+    }
+
+    private String userName;
+    private UserInfo userInfo;
+    private boolean accessTokenKeyChanged;
+    private boolean accessTokenSecretChanged;
+
+    private UserIdentityManager() {
+    }
+
+    /**
+     * Remembers the fact that the current JOSM user is anonymous.
+     */
+    public void setAnonymous() {
+        userName = null;
+        userInfo = null;
+    }
+
+    /**
+     * Remembers the fact that the current JOSM user is partially identified
+     * by the user name of its OSM account.
+     *
+     * @param userName the user name. Must not be null. Must not be empty (whitespace only).
+     * @throws IllegalArgumentException if userName is null
+     * @throws IllegalArgumentException if userName is empty
+     */
+    public void setPartiallyIdentified(String userName) {
+        CheckParameterUtil.ensureParameterNotNull(userName, "userName");
+        String trimmedUserName = userName.trim();
+        if (trimmedUserName.isEmpty())
+            throw new IllegalArgumentException(
+                    MessageFormat.format("Expected non-empty value for parameter ''{0}'', got ''{1}''", "userName", userName));
+        this.userName = trimmedUserName;
+        userInfo = null;
+    }
+
+    /**
+     * Remembers the fact that the current JOSM user is fully identified with a
+     * verified pair of user name and user id.
+     *
+     * @param userName the user name. Must not be null. Must not be empty.
+     * @param userInfo additional information about the user, retrieved from the OSM server and including the user id
+     * @throws IllegalArgumentException if userName is null
+     * @throws IllegalArgumentException if userName is empty
+     * @throws IllegalArgumentException if userInfo is null
+     */
+    public void setFullyIdentified(String userName, UserInfo userInfo) {
+        CheckParameterUtil.ensureParameterNotNull(userName, "userName");
+        String trimmedUserName = userName.trim();
+        if (trimmedUserName.isEmpty())
+            throw new IllegalArgumentException(tr("Expected non-empty value for parameter ''{0}'', got ''{1}''", "userName", userName));
+        CheckParameterUtil.ensureParameterNotNull(userInfo, "userInfo");
+        this.userName = trimmedUserName;
+        this.userInfo = userInfo;
+    }
+
+    /**
+     * Replies true if the current JOSM user is anonymous.
+     *
+     * @return {@code true} if the current user is anonymous.
+     */
+    public boolean isAnonymous() {
+        return userName == null && userInfo == null;
+    }
+
+    /**
+     * Replies true if the current JOSM user is partially identified.
+     *
+     * @return true if the current JOSM user is partially identified.
+     */
+    public boolean isPartiallyIdentified() {
+        return userName != null && userInfo == null;
+    }
+
+    /**
+     * Replies true if the current JOSM user is fully identified.
+     *
+     * @return true if the current JOSM user is fully identified.
+     */
+    public boolean isFullyIdentified() {
+        return userName != null && userInfo != null;
+    }
+
+    /**
+     * Replies the user name of the current JOSM user. null, if {@link #isAnonymous()} is true.
+     *
+     * @return the user name of the current JOSM user
+     */
+    public String getUserName() {
+        return userName;
+    }
+
+    /**
+     * Replies the user id of the current JOSM user. 0, if {@link #isAnonymous()} or
+     * {@link #isPartiallyIdentified()} is true.
+     *
+     * @return the user id of the current JOSM user
+     */
+    public int getUserId() {
+        if (userInfo == null) return 0;
+        return userInfo.getId();
+    }
+
+    /**
+     * Replies verified additional information about the current user if the user is
+     * {@link #isFullyIdentified()}.
+     *
+     * @return verified additional information about the current user
+     */
+    public UserInfo getUserInfo() {
+        return userInfo;
+    }
+
+    /**
+     * Returns the identity as a {@link User} object
+     *
+     * @return the identity as user, or {@link User#getAnonymous()} if {@link #isAnonymous()}
+     */
+    public User asUser() {
+        return isAnonymous() ? User.getAnonymous() : User.createOsmUser(userInfo != null ? userInfo.getId() : 0, userName);
+    }
+
+    /**
+     * Initializes the user identity manager from Basic Authentication values in the {@link org.openstreetmap.josm.data.Preferences}
+     * This method should be called if {@code osm-server.auth-method} is set to {@code basic}.
+     * @see #initFromOAuth
+     */
+    public void initFromPreferences() {
+        String userName = CredentialsManager.getInstance().getUsername();
+        if (isAnonymous()) {
+            if (userName != null && !userName.trim().isEmpty()) {
+                setPartiallyIdentified(userName);
+            }
+        } else {
+            if (userName != null && !userName.equals(this.userName)) {
+                setPartiallyIdentified(userName);
+            }
+            // else: same name in the preferences as JOSM already knows about.
+            // keep the state, be it partially or fully identified
+        }
+    }
+
+    /**
+     * Initializes the user identity manager from OAuth request of user details.
+     * This method should be called if {@code osm-server.auth-method} is set to {@code oauth}.
+     * @see #initFromPreferences
+     * @since 5434
+     */
+    public void initFromOAuth() {
+        try {
+            UserInfo info = new OsmServerUserInfoReader().fetchUserInfo(NullProgressMonitor.INSTANCE);
+            setFullyIdentified(info.getDisplayName(), info);
+        } catch (IllegalArgumentException | OsmTransferException e) {
+            Logging.error(e);
+        }
+    }
+
+    /**
+     * Replies true if the user with name <code>username</code> is the current user
+     *
+     * @param username the user name
+     * @return true if the user with name <code>username</code> is the current user
+     */
+    public boolean isCurrentUser(String username) {
+        return this.userName != null && this.userName.equals(username);
+    }
+
+    /**
+     * Replies true if the current user is {@link #isFullyIdentified() fully identified} and the {@link #getUserId() user ids} match,
+     * or if the current user is not {@link #isFullyIdentified() fully identified} and the {@link #getUserName() user names} match.
+     *
+     * @param user the user to test
+     * @return true if given user is the current user
+     */
+    public boolean isCurrentUser(User user) {
+        if (user == null) {
+            return false;
+        } else if (isFullyIdentified()) {
+            return getUserId() == user.getId();
+        } else {
+            return isCurrentUser(user.getName());
+        }
+    }
+
+    /* ------------------------------------------------------------------- */
+    /* interface PreferenceChangeListener                                  */
+    /* ------------------------------------------------------------------- */
+    @Override
+    public void preferenceChanged(PreferenceChangeEvent evt) {
+        switch (evt.getKey()) {
+        case "osm-server.username":
+            String newUserName = null;
+            if (evt.getNewValue() instanceof StringSetting) {
+                newUserName = ((StringSetting) evt.getNewValue()).getValue();
+            }
+            if (newUserName == null || newUserName.trim().isEmpty()) {
+                setAnonymous();
+            } else {
+                if (!newUserName.equals(userName)) {
+                    setPartiallyIdentified(newUserName);
+                }
+            }
+            return;
+        case "osm-server.url":
+            String newUrl = null;
+            if (evt.getNewValue() instanceof StringSetting) {
+                newUrl = ((StringSetting) evt.getNewValue()).getValue();
+            }
+            if (newUrl == null || newUrl.trim().isEmpty()) {
+                setAnonymous();
+            } else if (isFullyIdentified()) {
+                setPartiallyIdentified(getUserName());
+            }
+            break;
+        case "oauth.access-token.key":
+            accessTokenKeyChanged = true;
+            break;
+        case "oauth.access-token.secret":
+            accessTokenSecretChanged = true;
+            break;
+        default: // Do nothing
+        }
+
+        if (accessTokenKeyChanged && accessTokenSecretChanged) {
+            accessTokenKeyChanged = false;
+            accessTokenSecretChanged = false;
+            if (OsmApi.isUsingOAuth()) {
+                getInstance().initFromOAuth();
+            }
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 12743)
@@ -15,5 +15,5 @@
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
@@ -244,6 +244,6 @@
 
     /**
-     * If the current user {@link JosmUserIdentityManager#isAnonymous() is known}, the {@link #getOpenChangesets() open changesets}
-     * for the {@link JosmUserIdentityManager#isCurrentUser(User) current user} are returned. Otherwise,
+     * If the current user {@link UserIdentityManager#isAnonymous() is known}, the {@link #getOpenChangesets() open changesets}
+     * for the {@link UserIdentityManager#isCurrentUser(User) current user} are returned. Otherwise,
      * the unfiltered {@link #getOpenChangesets() open changesets} are returned.
      *
@@ -251,9 +251,9 @@
      */
     public List<Changeset> getOpenChangesetsForCurrentUser() {
-        if (JosmUserIdentityManager.getInstance().isAnonymous()) {
+        if (UserIdentityManager.getInstance().isAnonymous()) {
             return getOpenChangesets();
         } else {
             return new ArrayList<>(SubclassFilteredCollection.filter(getOpenChangesets(),
-                    object -> JosmUserIdentityManager.getInstance().isCurrentUser(object.getUser())));
+                    object -> UserIdentityManager.getInstance().isCurrentUser(object.getUser())));
         }
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/NoteData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 12743)
@@ -10,9 +10,9 @@
 import java.util.Map;
 
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.notes.Note.State;
 import org.openstreetmap.josm.data.notes.NoteComment;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.tools.ListenerList;
 import org.openstreetmap.josm.tools.Logging;
@@ -234,5 +234,5 @@
 
     private static User getCurrentUser() {
-        JosmUserIdentityManager userMgr = JosmUserIdentityManager.getInstance();
+        UserIdentityManager userMgr = UserIdentityManager.getInstance();
         return User.createOsmUser(userMgr.getUserId(), userMgr.getUserName());
     }
Index: trunk/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java	(revision 12743)
@@ -2,24 +2,8 @@
 package org.openstreetmap.josm.gui;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.text.MessageFormat;
-
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
-import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
-import org.openstreetmap.josm.data.oauth.OAuthAccessTokenHolder;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.UserInfo;
-import org.openstreetmap.josm.data.preferences.StringSetting;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.io.OnlineResource;
-import org.openstreetmap.josm.io.OsmApi;
-import org.openstreetmap.josm.io.OsmServerUserInfoReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-import org.openstreetmap.josm.io.auth.CredentialsManager;
-import org.openstreetmap.josm.tools.CheckParameterUtil;
-import org.openstreetmap.josm.tools.JosmRuntimeException;
-import org.openstreetmap.josm.tools.Logging;
 
 /**
@@ -50,7 +34,9 @@
  *   <li>safely search for objects last touched by the current user based on its user id, not on its user name</li>
  * </ul>
- *
+ * @since 2689 (creation)
+ * @deprecated to be removed end of 2017. Use {@link UserIdentityManager} instead
  */
-public final class JosmUserIdentityManager implements PreferenceChangedListener {
+@Deprecated
+public final class JosmUserIdentityManager {
 
     private static JosmUserIdentityManager instance;
@@ -64,25 +50,8 @@
         if (instance == null) {
             instance = new JosmUserIdentityManager();
-            if (OsmApi.isUsingOAuth() && OAuthAccessTokenHolder.getInstance().containsAccessToken() &&
-                    !Main.isOffline(OnlineResource.OSM_API)) {
-                try {
-                    instance.initFromOAuth();
-                } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
-                    Logging.error(e);
-                    // Fall back to preferences if OAuth identification fails for any reason
-                    instance.initFromPreferences();
-                }
-            } else {
-                instance.initFromPreferences();
-            }
-            Main.pref.addPreferenceChangeListener(instance);
+            UserIdentityManager.getInstance();
         }
         return instance;
     }
-
-    private String userName;
-    private UserInfo userInfo;
-    private boolean accessTokenKeyChanged;
-    private boolean accessTokenSecretChanged;
 
     private JosmUserIdentityManager() {
@@ -93,6 +62,5 @@
      */
     public void setAnonymous() {
-        userName = null;
-        userInfo = null;
+        UserIdentityManager.getInstance().setAnonymous();
     }
 
@@ -106,11 +74,5 @@
      */
     public void setPartiallyIdentified(String userName) {
-        CheckParameterUtil.ensureParameterNotNull(userName, "userName");
-        String trimmedUserName = userName.trim();
-        if (trimmedUserName.isEmpty())
-            throw new IllegalArgumentException(
-                    MessageFormat.format("Expected non-empty value for parameter ''{0}'', got ''{1}''", "userName", userName));
-        this.userName = trimmedUserName;
-        userInfo = null;
+        UserIdentityManager.getInstance().setPartiallyIdentified(userName);
     }
 
@@ -126,11 +88,5 @@
      */
     public void setFullyIdentified(String userName, UserInfo userInfo) {
-        CheckParameterUtil.ensureParameterNotNull(userName, "userName");
-        String trimmedUserName = userName.trim();
-        if (trimmedUserName.isEmpty())
-            throw new IllegalArgumentException(tr("Expected non-empty value for parameter ''{0}'', got ''{1}''", "userName", userName));
-        CheckParameterUtil.ensureParameterNotNull(userInfo, "userInfo");
-        this.userName = trimmedUserName;
-        this.userInfo = userInfo;
+        UserIdentityManager.getInstance().setFullyIdentified(userName, userInfo);
     }
 
@@ -141,5 +97,5 @@
      */
     public boolean isAnonymous() {
-        return userName == null && userInfo == null;
+        return UserIdentityManager.getInstance().isAnonymous();
     }
 
@@ -150,5 +106,5 @@
      */
     public boolean isPartiallyIdentified() {
-        return userName != null && userInfo == null;
+        return UserIdentityManager.getInstance().isPartiallyIdentified();
     }
 
@@ -159,5 +115,5 @@
      */
     public boolean isFullyIdentified() {
-        return userName != null && userInfo != null;
+        return UserIdentityManager.getInstance().isFullyIdentified();
     }
 
@@ -168,5 +124,5 @@
      */
     public String getUserName() {
-        return userName;
+        return UserIdentityManager.getInstance().getUserName();
     }
 
@@ -178,6 +134,5 @@
      */
     public int getUserId() {
-        if (userInfo == null) return 0;
-        return userInfo.getId();
+        return UserIdentityManager.getInstance().getUserId();
     }
 
@@ -189,5 +144,5 @@
      */
     public UserInfo getUserInfo() {
-        return userInfo;
+        return UserIdentityManager.getInstance().getUserInfo();
     }
 
@@ -198,5 +153,5 @@
      */
     public User asUser() {
-        return isAnonymous() ? User.getAnonymous() : User.createOsmUser(userInfo != null ? userInfo.getId() : 0, userName);
+        return UserIdentityManager.getInstance().asUser();
     }
 
@@ -207,16 +162,5 @@
      */
     public void initFromPreferences() {
-        String userName = CredentialsManager.getInstance().getUsername();
-        if (isAnonymous()) {
-            if (userName != null && !userName.trim().isEmpty()) {
-                setPartiallyIdentified(userName);
-            }
-        } else {
-            if (userName != null && !userName.equals(this.userName)) {
-                setPartiallyIdentified(userName);
-            }
-            // else: same name in the preferences as JOSM already knows about.
-            // keep the state, be it partially or fully identified
-        }
+        UserIdentityManager.getInstance().initFromPreferences();
     }
 
@@ -228,10 +172,5 @@
      */
     public void initFromOAuth() {
-        try {
-            UserInfo info = new OsmServerUserInfoReader().fetchUserInfo(NullProgressMonitor.INSTANCE);
-            setFullyIdentified(info.getDisplayName(), info);
-        } catch (IllegalArgumentException | OsmTransferException e) {
-            Logging.error(e);
-        }
+        UserIdentityManager.getInstance().initFromOAuth();
     }
 
@@ -243,10 +182,10 @@
      */
     public boolean isCurrentUser(String username) {
-        return this.userName != null && this.userName.equals(username);
+        return UserIdentityManager.getInstance().isCurrentUser(username);
     }
 
     /**
      * Replies true if the current user is {@link #isFullyIdentified() fully identified} and the {@link #getUserId() user ids} match,
-     * or if the current user is not {@link #isFullyIdentified() fully identified} and the {@link #userName user names} match.
+     * or if the current user is not {@link #isFullyIdentified() fully identified} and the {@link #getUserName() user names} match.
      *
      * @param user the user to test
@@ -254,59 +193,5 @@
      */
     public boolean isCurrentUser(User user) {
-        if (user == null) {
-            return false;
-        } else if (isFullyIdentified()) {
-            return getUserId() == user.getId();
-        } else {
-            return isCurrentUser(user.getName());
-        }
-    }
-
-    /* ------------------------------------------------------------------- */
-    /* interface PreferenceChangeListener                                  */
-    /* ------------------------------------------------------------------- */
-    @Override
-    public void preferenceChanged(PreferenceChangeEvent evt) {
-        switch (evt.getKey()) {
-        case "osm-server.username":
-            String newUserName = null;
-            if (evt.getNewValue() instanceof StringSetting) {
-                newUserName = ((StringSetting) evt.getNewValue()).getValue();
-            }
-            if (newUserName == null || newUserName.trim().isEmpty()) {
-                setAnonymous();
-            } else {
-                if (!newUserName.equals(userName)) {
-                    setPartiallyIdentified(newUserName);
-                }
-            }
-            return;
-        case "osm-server.url":
-            String newUrl = null;
-            if (evt.getNewValue() instanceof StringSetting) {
-                newUrl = ((StringSetting) evt.getNewValue()).getValue();
-            }
-            if (newUrl == null || newUrl.trim().isEmpty()) {
-                setAnonymous();
-            } else if (isFullyIdentified()) {
-                setPartiallyIdentified(getUserName());
-            }
-            break;
-        case "oauth.access-token.key":
-            accessTokenKeyChanged = true;
-            break;
-        case "oauth.access-token.secret":
-            accessTokenSecretChanged = true;
-            break;
-        default: // Do nothing
-        }
-
-        if (accessTokenKeyChanged && accessTokenSecretChanged) {
-            accessTokenKeyChanged = false;
-            accessTokenSecretChanged = false;
-            if (OsmApi.isUsingOAuth()) {
-                getInstance().initFromOAuth();
-            }
-        }
+        return UserIdentityManager.getInstance().isCurrentUser(user);
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 12743)
@@ -47,4 +47,5 @@
 import org.openstreetmap.josm.actions.downloadtasks.ChangesetQueryTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetCache;
@@ -53,5 +54,4 @@
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.changeset.query.ChangesetQueryDialog;
@@ -465,5 +465,5 @@
         protected void updateEnabledState() {
             List<Changeset> selected = model.getSelectedChangesets();
-            JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+            UserIdentityManager im = UserIdentityManager.getInstance();
             for (Changeset cs: selected) {
                 if (cs.isOpen()) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java	(revision 12743)
@@ -21,5 +21,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
@@ -158,5 +158,5 @@
         // partially identified
         lbl = lblQueries.get(BasicQuery.MY_OPEN_CHANGESETS);
-        if (JosmUserIdentityManager.getInstance().isAnonymous()) {
+        if (UserIdentityManager.getInstance().isAnonymous()) {
             rbQueries.get(BasicQuery.MY_OPEN_CHANGESETS).setEnabled(false);
             lbl.setText(tr("<html>Download my open changesets<br><em>Disabled. " +
@@ -232,5 +232,5 @@
         BasicQuery q = getSelectedQuery();
         ChangesetQuery query = new ChangesetQuery();
-        JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+        UserIdentityManager im = UserIdentityManager.getInstance();
         if (q == null)
             return query;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UserRestrictionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UserRestrictionPanel.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UserRestrictionPanel.java	(revision 12743)
@@ -19,6 +19,6 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.preferences.server.UserNameValidator;
@@ -163,5 +163,5 @@
      */
     public void startUserInput() {
-        if (JosmUserIdentityManager.getInstance().isAnonymous()) {
+        if (UserIdentityManager.getInstance().isAnonymous()) {
             lblRestrictedToMyself.setText(tr("Only changesets owned by myself (disabled. JOSM is currently run by an anonymous user)"));
             rbRestrictToMyself.setEnabled(false);
@@ -188,5 +188,5 @@
         CheckParameterUtil.ensureParameterNotNull(query, "query");
         if (rbRestrictToMyself.isSelected()) {
-            JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+            UserIdentityManager im = UserIdentityManager.getInstance();
             if (im.isPartiallyIdentified()) {
                 query.forUser(im.getUserName());
@@ -277,5 +277,5 @@
         String v = Main.pref.get(PREF_QUERY_TYPE, "mine");
         if ("mine".equals(v)) {
-            JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+            UserIdentityManager im = UserIdentityManager.getInstance();
             if (im.isAnonymous()) {
                 rbRestrictToUid.setSelected(true);
Index: trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java	(revision 12743)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.actions.downloadtasks.ChangesetQueryTask;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
@@ -32,5 +33,4 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.Projections;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapViewState;
@@ -193,5 +193,5 @@
             setName(tr("Home location"));
             setIcon(ImageProvider.get("help", "home", ImageSizes.SMALLICON));
-            UserInfo info = JosmUserIdentityManager.getInstance().getUserInfo();
+            UserInfo info = UserIdentityManager.getInstance().getUserInfo();
             if (info == null) {
                 throw new IllegalStateException("User not identified");
@@ -251,5 +251,5 @@
         final DefaultListModel<Bookmark> model = (DefaultListModel<Bookmark>) getModel();
         model.removeAllElements();
-        JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+        UserIdentityManager im = UserIdentityManager.getInstance();
         // Add home location bookmark first, if user fully identified
         if (im.isFullyIdentified()) {
Index: trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 12743)
@@ -24,5 +24,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.gui.download.BookmarkList.Bookmark;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -290,5 +290,5 @@
             putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "downloadchangeset"));
             putValue(SHORT_DESCRIPTION, tr("Download bookmarks for my {0} last changesets", BookmarkList.MAX_CHANGESET_BOOKMARKS.get()));
-            setEnabled(!JosmUserIdentityManager.getInstance().isAnonymous());
+            setEnabled(!UserIdentityManager.getInstance().isAnonymous());
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 12743)
@@ -11,4 +11,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -35,5 +36,4 @@
 import org.openstreetmap.josm.data.osm.history.HistoryWay;
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -674,5 +674,5 @@
 
         private static User getCurrentUser() {
-            UserInfo info = JosmUserIdentityManager.getInstance().getUserInfo();
+            UserInfo info = UserIdentityManager.getInstance().getUserInfo();
             return info == null ? User.getAnonymous() : User.createOsmUser(info.getId(), info.getDisplayName());
         }
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 12743)
@@ -25,9 +25,9 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.ChangesetDialog;
@@ -256,5 +256,5 @@
             }
         } else {
-            String username = JosmUserIdentityManager.getInstance().getUserName();
+            String username = UserIdentityManager.getInstance().getUserName();
             if (username == null) {
                 lblUser.setDescription(tr("anonymous"));
Index: trunk/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java	(revision 12743)
@@ -14,9 +14,9 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.data.osm.UserInfo;
 import org.openstreetmap.josm.gui.ExceptionDialogUtil;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -61,5 +61,5 @@
     @Override
     protected void finish() {
-        if (JosmUserIdentityManager.getInstance().isAnonymous()) {
+        if (UserIdentityManager.getInstance().isAnonymous()) {
             String msg = tr("Could not retrieve the list of your open changesets because<br>"
                     + "JOSM does not know your identity.<br>"
@@ -96,5 +96,5 @@
      */
     protected void refreshUserIdentity() {
-        JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+        UserIdentityManager im = UserIdentityManager.getInstance();
         try {
             OsmServerUserInfoReader infoReader = new OsmServerUserInfoReader();
@@ -122,5 +122,5 @@
     protected void realRun() throws SAXException, IOException, OsmTransferException {
         try {
-            JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+            UserIdentityManager im = UserIdentityManager.getInstance();
             if (im.isAnonymous()) {
                 refreshUserIdentity();
Index: trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 12743)
@@ -17,6 +17,6 @@
 
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
@@ -71,5 +71,5 @@
      */
     public static ChangesetQuery forCurrentUser() {
-        JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+        UserIdentityManager im = UserIdentityManager.getInstance();
         if (im.isAnonymous()) {
             throw new IllegalStateException("anonymous user");
Index: trunk/src/org/openstreetmap/josm/io/MessageNotifier.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 12743)
@@ -17,8 +17,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.UserInfo;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
@@ -130,5 +130,5 @@
      */
     public static boolean isUserEnoughIdentified() {
-        JosmUserIdentityManager identManager = JosmUserIdentityManager.getInstance();
+        UserIdentityManager identManager = UserIdentityManager.getInstance();
         if (identManager.isFullyIdentified()) {
             return true;
Index: trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 12743)
@@ -13,8 +13,8 @@
 import java.util.concurrent.TimeUnit;
 
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -202,5 +202,5 @@
                 api.openChangeset(changeset, monitor.createSubTaskMonitor(0, false));
                 // update the user information
-                changeset.setUser(JosmUserIdentityManager.getInstance().asUser());
+                changeset.setUser(UserIdentityManager.getInstance().asUser());
             } else {
                 api.updateChangeset(changeset, monitor.createSubTaskMonitor(0, false));
Index: trunk/src/org/openstreetmap/josm/io/auth/CredentialsManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/auth/CredentialsManager.java	(revision 12742)
+++ trunk/src/org/openstreetmap/josm/io/auth/CredentialsManager.java	(revision 12743)
@@ -7,6 +7,6 @@
 import java.util.Objects;
 
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
-import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -122,5 +122,5 @@
             String username = credentials.getUserName();
             if (username != null && !username.trim().isEmpty()) {
-                JosmUserIdentityManager.getInstance().setPartiallyIdentified(username);
+                UserIdentityManager.getInstance().setPartiallyIdentified(username);
             }
         }
