Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 3451)
@@ -324,26 +324,35 @@
     }
 
-    synchronized public boolean put(final String key, String value) {
-        String oldvalue = properties.get(key);
-        if(value != null && value.length() == 0) {
-            value = null;
-        }
-        if(!((oldvalue == null && (value == null || value.equals(defaults.get(key))))
-                || (value != null && oldvalue != null && oldvalue.equals(value))))
-        {
-            if (value == null) {
-                properties.remove(key);
-            } else {
-                properties.put(key, value);
-            }
-            try {
-                save();
-            } catch(IOException e){
-                System.out.println(tr("Warning: failed to persist preferences to ''{0}''", getPreferenceFile().getAbsoluteFile()));
-            }
-            firePrefrenceChanged(key, oldvalue, value);
-            return true;
-        }
-        return false;
+    public boolean put(final String key, String value) {
+
+        boolean changed = false;
+        String oldValue = null;
+
+        synchronized (this) {
+            oldValue = properties.get(key);
+            if(value != null && value.length() == 0) {
+                value = null;
+            }
+            if(!((oldValue == null && (value == null || value.equals(defaults.get(key))))
+                    || (value != null && oldValue != null && oldValue.equals(value))))
+            {
+                if (value == null) {
+                    properties.remove(key);
+                } else {
+                    properties.put(key, value);
+                }
+                try {
+                    save();
+                } catch(IOException e){
+                    System.out.println(tr("Warning: failed to persist preferences to ''{0}''", getPreferenceFile().getAbsoluteFile()));
+                }
+                changed = true;
+            }
+        }
+        if (changed) {
+            // Call outside of synchronized section in case some listener wait for other thread that wait for preference lock
+            firePrefrenceChanged(key, oldValue, value);
+        }
+        return changed;
     }
 
@@ -699,7 +708,5 @@
         }
         if(s != null && s.length() != 0)
-        {
             return Arrays.asList(s.split("\u001e"));
-        }
         return def;
     }
Index: trunk/src/org/openstreetmap/josm/data/preferences/BooleanProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/BooleanProperty.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/data/preferences/BooleanProperty.java	(revision 3451)
@@ -15,9 +15,17 @@
 
     public boolean get() {
-        return Main.pref.getBoolean(key, defaultValue);
+        return Main.pref.getBoolean(getKey(), isDefaultValue());
     }
 
     public boolean put(boolean value) {
-        return Main.pref.put(key, value);
+        return Main.pref.put(getKey(), value);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public boolean isDefaultValue() {
+        return defaultValue;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/preferences/CollectionProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/CollectionProperty.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/data/preferences/CollectionProperty.java	(revision 3451)
@@ -16,9 +16,17 @@
 
     public Collection<String> get() {
-        return Main.pref.getCollection(key, defaultValue);
+        return Main.pref.getCollection(getKey(), getDefaultValue());
     }
 
     public boolean put(Collection<String> value) {
-        return Main.pref.putCollection(key, value);
+        return Main.pref.putCollection(getKey(), value);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public Collection<String> getDefaultValue() {
+        return defaultValue;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/preferences/IntegerProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/IntegerProperty.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/data/preferences/IntegerProperty.java	(revision 3451)
@@ -15,9 +15,17 @@
 
     public int get() {
-        return Main.pref.getInteger(key, defaultValue);
+        return Main.pref.getInteger(getKey(), getDefaultValue());
     }
 
     public boolean put(int value) {
-        return Main.pref.putInteger(key, value);
+        return Main.pref.putInteger(getKey(), value);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public int getDefaultValue() {
+        return defaultValue;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/preferences/StringProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/StringProperty.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/data/preferences/StringProperty.java	(revision 3451)
@@ -15,9 +15,17 @@
 
     public String get() {
-        return Main.pref.get(key, defaultValue);
+        return Main.pref.get(getKey(), getDefaultValue());
     }
 
     public boolean put(String value) {
-        return Main.pref.put(key, value);
+        return Main.pref.put(getKey(), value);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 3451)
@@ -57,4 +57,5 @@
             ((Destroyable) action).destroy();
         }
+        action.removePropertyChangeListener(this);
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 3450)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 3451)
@@ -175,5 +175,5 @@
      * The last event performed by mouse.
      */
-    public MouseEvent lastMEvent;
+    public MouseEvent lastMEvent = new MouseEvent(this, 0, 0, 0, 0, 0, 0, false); // In case somebody reads it before first mouse move
 
     private LinkedList<MapViewPaintable> temporaryLayers = new LinkedList<MapViewPaintable>();
