Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2617)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2618)
@@ -24,4 +24,5 @@
 import java.util.TreeMap;
 import java.util.Map.Entry;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -50,6 +51,43 @@
     private File preferencesDirFile = null;
 
+    public static interface PreferenceChangeEvent{
+        public String getKey();
+        public String getOldValue();
+        public String getNewValue();
+    }
+
     public static interface PreferenceChangedListener {
-        void preferenceChanged(String key, String newValue);
+        void preferenceChanged(PreferenceChangeEvent e);
+    }
+
+    private static class DefaultPreferenceChangeEvent implements PreferenceChangeEvent {
+        private String key;
+        private String oldValue;
+        private String newValue;
+
+        public DefaultPreferenceChangeEvent(String key, String oldValue, String newValue) {
+            this.key = key;
+            this.oldValue = oldValue;
+            this.newValue = newValue;
+        }
+
+        public String getKey() {
+            return key;
+        }
+        public void setKey(String key) {
+            this.key = key;
+        }
+        public String getOldValue() {
+            return oldValue;
+        }
+        public void setOldValue(String oldValue) {
+            this.oldValue = oldValue;
+        }
+        public String getNewValue() {
+            return newValue;
+        }
+        public void setNewValue(String newValue) {
+            this.newValue = newValue;
+        }
     }
 
@@ -96,5 +134,25 @@
     }
 
-    public final ArrayList<PreferenceChangedListener> listener = new ArrayList<PreferenceChangedListener>();
+    private final CopyOnWriteArrayList<PreferenceChangedListener> listeners = new CopyOnWriteArrayList<PreferenceChangedListener>();
+
+
+    public void addPreferenceChangeListener(PreferenceChangedListener listener) {
+        if (listener != null && ! listeners.contains(listener)) {
+            listeners.add(listener);
+        }
+    }
+
+    public void removePreferenceChangeListener(PreferenceChangedListener listener) {
+        if (listener != null && listeners.contains(listener)) {
+            listeners.remove(listener);
+        }
+    }
+
+    protected void firePrefrenceChanged(String key, String oldValue, String newValue) {
+        PreferenceChangeEvent evt = new DefaultPreferenceChangeEvent(key, oldValue, newValue);
+        for (PreferenceChangedListener l : listeners) {
+            l.preferenceChanged(evt);
+        }
+    }
 
     /**
@@ -289,5 +347,5 @@
                 System.out.println(tr("Warning: failed to persist preferences to ''{0}''", getPreferenceFile().getAbsoluteFile()));
             }
-            firePreferenceChanged(key, value);
+            firePrefrenceChanged(key, oldvalue, value);
             return true;
         }
@@ -311,9 +369,4 @@
     }
 
-    private final void firePreferenceChanged(final String key, final String value) {
-        for (final PreferenceChangedListener l : listener) {
-            l.preferenceChanged(key, value);
-        }
-    }
 
     /**
@@ -618,6 +671,7 @@
     synchronized public String getCollectionAsString(final String key) {
         String s = get(key);
-        if(s != null && s.length() != 0)
+        if(s != null && s.length() != 0) {
             s = s.replaceAll("\u001e",",");
+        }
         return s;
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 2617)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 2618)
@@ -10,5 +10,9 @@
 import java.util.logging.Logger;
 
-public class ChangesetCache {
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+
+public class ChangesetCache implements PreferenceChangedListener{
     static private final Logger logger = Logger.getLogger(ChangesetCache.class.getName());
     static private final ChangesetCache instance = new ChangesetCache();
@@ -24,4 +28,5 @@
 
     private ChangesetCache() {
+        Main.pref.addPreferenceChangeListener(this);
     }
 
@@ -135,3 +140,16 @@
         return ret;
     }
+
+    /* ------------------------------------------------------------------------- */
+    /* interface PreferenceChangedListener                                       */
+    /* ------------------------------------------------------------------------- */
+    public void preferenceChanged(PreferenceChangeEvent e) {
+        if (e.getKey() == null || ! e.getKey().equals("osm-server.url"))
+            return;
+
+        // clear the cache when the API url changes
+        if (e.getOldValue() == null || e.getNewValue() == null || !e.getOldValue().equals(e.getNewValue())) {
+            clear();
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 2617)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 2618)
@@ -30,4 +30,6 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -45,5 +47,5 @@
  *
  */
-public class UploadDialog extends JDialog implements PropertyChangeListener{
+public class UploadDialog extends JDialog implements PropertyChangeListener, PreferenceChangedListener{
     protected static final Logger logger = Logger.getLogger(UploadDialog.class.getName());
 
@@ -221,4 +223,6 @@
                 }
         );
+
+        Main.pref.addPreferenceChangeListener(this);
     }
 
@@ -453,3 +457,16 @@
         }
     }
+
+    /* -------------------------------------------------------------------------- */
+    /* Interface PreferenceChangedListener                                        */
+    /* -------------------------------------------------------------------------- */
+    public void preferenceChanged(PreferenceChangeEvent e) {
+        if (e.getKey() == null || ! e.getKey().equals("osm-server.url"))
+            return;
+        if (e.getNewValue() == null) {
+            setTitle(tr("Upload"));
+        } else {
+            setTitle(tr("Upload to ''{0}''", e.getNewValue()));
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 2617)
+++ trunk/src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 2618)
@@ -34,4 +34,5 @@
 import org.openstreetmap.josm.actions.RenameLayerAction;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -113,5 +114,5 @@
         setAssociatedFile(associatedFile);
         this.data = data;
-        Main.pref.listener.add(this);
+        Main.pref.addPreferenceChangeListener(this);
     }
 
@@ -284,6 +285,6 @@
     }
 
-    public void preferenceChanged(String key, String newValue) {
-        if (Main.map != null && (key.equals("draw.rawgps.lines") || key.equals("draw.rawgps.lines.force"))) {
+    public void preferenceChanged(PreferenceChangeEvent e) {
+        if (Main.map != null && (e.getKey().equals("draw.rawgps.lines") || e.getKey().equals("draw.rawgps.lines.force"))) {
             Main.map.repaint();
         }
@@ -291,5 +292,5 @@
 
     @Override public void destroy() {
-        Main.pref.listener.remove(RawGpsLayer.this);
+        Main.pref.removePreferenceChangeListener(this);
     }
 }
