Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2655)
@@ -30,5 +30,4 @@
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import javax.swing.JComponent;
@@ -62,5 +61,5 @@
  */
 public class DrawAction extends MapMode implements MapViewPaintable, SelectionChangedListener, AWTEventListener {
-    static private final Logger logger = Logger.getLogger(DrawAction.class.getName());
+    //static private final Logger logger = Logger.getLogger(DrawAction.class.getName());
 
     final private Cursor cursorCrosshair;
@@ -70,5 +69,5 @@
     private Cursors currCursor = Cursors.crosshair;
 
-    private static Node lastUsedNode = null;
+    private Node lastUsedNode = null;
     private double PHI=Math.toRadians(90);
 
@@ -119,26 +118,24 @@
         if(currCursor.equals(c) || (!drawTargetCursor && currCursor.equals(Cursors.crosshair)))
             return;
-        try {
-            // We invoke this to prevent strange things from happening
-            EventQueue.invokeLater(new Runnable() {
-                public void run() {
-                    // Don't change cursor when mode has changed already
-                    if(!(Main.map.mapMode instanceof DrawAction))
-                        return;
-                    switch(c) {
-                    case way:
-                        Main.map.mapView.setCursor(cursorJoinWay);
-                        break;
-                    case node:
-                        Main.map.mapView.setCursor(cursorJoinNode);
-                        break;
-                    default:
-                        Main.map.mapView.setCursor(cursorCrosshair);
-                        break;
-                    }
-                }
-            });
-            currCursor = c;
-        } catch(Exception e) {}
+        // We invoke this to prevent strange things from happening
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                // Don't change cursor when mode has changed already
+                if(!(Main.map.mapMode instanceof DrawAction))
+                    return;
+                switch(c) {
+                case way:
+                    Main.map.mapView.setCursor(cursorJoinWay);
+                    break;
+                case node:
+                    Main.map.mapView.setCursor(cursorJoinNode);
+                    break;
+                default:
+                    Main.map.mapView.setCursor(cursorCrosshair);
+                    break;
+                }
+            }
+        });
+        currCursor = c;
     }
 
@@ -975,5 +972,5 @@
          */
         if (getCurrentDataSet() != null && getCurrentDataSet().getSelectedWays().size() > 0 && !wayIsFinished && !alt) {
-            Way w = (Way) getCurrentDataSet().getSelectedWays().iterator().next();
+            Way w = getCurrentDataSet().getSelectedWays().iterator().next();
             for (Node m : w.getNodes()) {
                 if (m.equals(mouseOnExistingNode) || mouseOnExistingWays.contains(w)) {
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2655)
@@ -26,5 +26,4 @@
 import java.util.Map.Entry;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -44,5 +43,5 @@
  */
 public class Preferences {
-    static private final Logger logger = Logger.getLogger(Preferences.class.getName());
+    //static private final Logger logger = Logger.getLogger(Preferences.class.getName());
 
     /**
@@ -131,13 +130,11 @@
 
     public void addPreferenceChangeListener(PreferenceChangedListener listener) {
-        if (listener != null && ! listeners.contains(listener)) {
-            listeners.add(listener);
+        if (listener != null) {
+            listeners.addIfAbsent(listener);
         }
     }
 
     public void removePreferenceChangeListener(PreferenceChangedListener listener) {
-        if (listener != null && listeners.contains(listener)) {
-            listeners.remove(listener);
-        }
+        listeners.remove(listener);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java	(revision 2655)
@@ -42,13 +42,11 @@
 
     public void addConflictListener(IConflictListener listener) {
-        if (listener != null && ! listeners.contains(listener)) {
-            listeners.add(listener);
+        if (listener != null) {
+            listeners.addIfAbsent(listener);
         }
     }
 
     public void removeConflictListener(IConflictListener listener) {
-        if (listener != null) {
-            listeners.remove(listener);
-        }
+        listeners.remove(listener);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 2655)
@@ -8,5 +8,4 @@
 import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.logging.Logger;
 
 import org.openstreetmap.josm.Main;
@@ -15,5 +14,5 @@
 
 public class ChangesetCache implements PreferenceChangedListener{
-    static private final Logger logger = Logger.getLogger(ChangesetCache.class.getName());
+    //static private final Logger logger = Logger.getLogger(ChangesetCache.class.getName());
     static private final ChangesetCache instance = new ChangesetCache();
 
@@ -32,17 +31,11 @@
 
     public void addChangesetCacheListener(ChangesetCacheListener listener) {
-        synchronized(listeners) {
-            if (listener != null && ! listeners.contains(listener)) {
-                listeners.add(listener);
-            }
+        if (listener != null) {
+            listeners.addIfAbsent(listener);
         }
     }
 
     public void removeChangesetCacheListener(ChangesetCacheListener listener) {
-        synchronized(listeners) {
-            if (listener != null && listeners.contains(listener)) {
-                listeners.remove(listener);
-            }
-        }
+        listeners.remove(listener);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2655)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.ChangesetIdChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListener;
@@ -863,4 +864,8 @@
     }
 
+    void fireChangesetIdChanged(OsmPrimitive primitive, int oldChangesetId, int newChangesetId) {
+        fireEvent(new ChangesetIdChangedEvent(this, Collections.singletonList(primitive), oldChangesetId, newChangesetId));
+    }
+
     public void clenupDeletedPrimitives() {
         if (cleanupDeleted(nodes.iterator())
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2655)
@@ -649,9 +649,15 @@
      */
     public void setChangesetId(int changesetId) throws IllegalStateException, IllegalArgumentException {
+        if (this.changesetId == changesetId)
+            return;
         if (changesetId < 0)
             throw new IllegalArgumentException(tr("Parameter ''{0}'' >= 0 expected, got {1}", "changesetId", changesetId));
         if (isNew() && changesetId > 0)
             throw new IllegalStateException(tr("Can''t assign a changesetId > 0 to a new primitive. Value of changesetId is {0}", changesetId));
+        int old = this.changesetId;
         this.changesetId = changesetId;
+        if (dataSet != null) {
+            dataSet.fireChangesetIdChanged(this, old, changesetId);
+        }
     }
 
@@ -1003,5 +1009,5 @@
         flags = other.flags;
         user= other.user;
-        changesetId = other.changesetId;
+        setChangesetId(other.changesetId);
         clearCached();
     }
@@ -1031,5 +1037,5 @@
         flags = other.flags;
         user= other.user;
-        changesetId = other.changesetId;
+        setChangesetId(other.changesetId);
     }
 
@@ -1178,5 +1184,5 @@
         timestamp = data.getTimestamp();
         user = data.getUser();
-        changesetId = data.getChangesetId();
+        setChangesetId(data.getChangesetId());
         setDeleted(data.isDeleted());
         setModified(data.isModified());
Index: trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java	(revision 2655)
@@ -11,5 +11,5 @@
 
     public enum DatasetEventType {DATA_CHANGED, NODE_MOVED, PRIMITIVES_ADDED, PRIMITIVES_REMOVED,
-        RELATION_MEMBERS_CHANGED, TAGS_CHANGED, WAY_NODES_CHANGED}
+        RELATION_MEMBERS_CHANGED, TAGS_CHANGED, WAY_NODES_CHANGED, CHANGESET_ID_CHANGED}
 
     protected final DataSet dataSet;
Index: trunk/src/org/openstreetmap/josm/data/osm/event/ChangesetIdChangedEvent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/ChangesetIdChangedEvent.java	(revision 2655)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/ChangesetIdChangedEvent.java	(revision 2655)
@@ -0,0 +1,46 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+
+public class ChangesetIdChangedEvent extends AbstractDatasetChangedEvent {
+
+    private final List<OsmPrimitive> primitives;
+    private final int oldChangesetId;
+    private final int newChangesetId;
+
+    public ChangesetIdChangedEvent(DataSet dataSet, List<OsmPrimitive> primitives, int oldChangesetId, int newChangesetId) {
+        super(dataSet);
+        this.primitives = primitives;
+        this.oldChangesetId = oldChangesetId;
+        this.newChangesetId = newChangesetId;
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.otherDatasetChange(this);
+    }
+
+    @Override
+    public List<OsmPrimitive> getPrimitives() {
+        return primitives;
+    }
+
+    @Override
+    public DatasetEventType getType() {
+        return DatasetEventType.CHANGESET_ID_CHANGED;
+    }
+
+    public int getOldChangesetId() {
+        return oldChangesetId;
+    }
+
+    public int getNewChangesetId() {
+        return newChangesetId;
+    }
+
+}
Index: trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java	(revision 2655)
@@ -73,8 +73,14 @@
 
     /**
+     * Minor dataset change, currently only changeset id changed is supported, but can
+     * be extended in future.
+     * @param event
+     */
+    void otherDatasetChange(AbstractDatasetChangedEvent event);
+
+    /**
      * Called after big changes in dataset. Usually other events are stopped using Dataset.beginUpdate() and
      * after operation is completed (Dataset.endUpdate()), {@link #dataChanged()} is called.
      */
     void dataChanged(DataChangedEvent event);
-
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListenerAdapter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListenerAdapter.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListenerAdapter.java	(revision 2655)
@@ -48,3 +48,7 @@
     }
 
+    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java	(revision 2655)
@@ -7,5 +7,4 @@
 import java.util.HashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.logging.Logger;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -19,5 +18,5 @@
  */
 public class HistoryDataSet {
-    private final static Logger logger = Logger.getLogger(HistoryDataSet.class.getName());
+    //private final static Logger logger = Logger.getLogger(HistoryDataSet.class.getName());
 
     /** the unique instance */
@@ -46,17 +45,11 @@
 
     public void addHistoryDataSetListener(HistoryDataSetListener listener) {
-        synchronized(listeners) {
-            if (!listeners.contains(listener)) {
-                listeners.add(listener);
-            }
+        if (listener != null) {
+            listeners.addIfAbsent(listener);
         }
     }
 
     public void removeHistoryDataSetListener(HistoryDataSetListener listener) {
-        synchronized(listeners) {
-            if (listeners.contains(listener)) {
-                listeners.remove(listener);
-            }
-        }
+        listeners.remove(listener);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 2655)
@@ -9,5 +9,4 @@
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -334,6 +333,6 @@
      * the mapMode listeners
      */
-    private static final Collection<MapModeChangeListener> mapModeChangeListeners = new CopyOnWriteArrayList<MapModeChangeListener>();
-     /**
+    private static final CopyOnWriteArrayList<MapModeChangeListener> mapModeChangeListeners = new CopyOnWriteArrayList<MapModeChangeListener>();
+    /**
      * Adds a mapMode change listener
      *
@@ -341,6 +340,6 @@
      */
     public static void addMapModeChangeListener(MapModeChangeListener listener) {
-        if (listener != null && ! mapModeChangeListeners.contains(listener)) {
-            mapModeChangeListeners.add(listener);
+        if (listener != null) {
+            mapModeChangeListeners.addIfAbsent(listener);
         }
     }
@@ -351,7 +350,5 @@
      */
     public static void removeMapModeChangeListener(MapModeChangeListener listener) {
-        if (listener != null && mapModeChangeListeners.contains(listener)) {
-            mapModeChangeListeners.remove(listener);
-        }
+        mapModeChangeListeners.remove(listener);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2655)
@@ -83,6 +83,6 @@
      * the layer listeners
      */
-    private static final Collection<MapView.LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<MapView.LayerChangeListener>();
-    private static final Collection<EditLayerChangeListener> editLayerChangeListeners = new CopyOnWriteArrayList<EditLayerChangeListener>();
+    private static final CopyOnWriteArrayList<MapView.LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<MapView.LayerChangeListener>();
+    private static final CopyOnWriteArrayList<EditLayerChangeListener> editLayerChangeListeners = new CopyOnWriteArrayList<EditLayerChangeListener>();
 
     /**
@@ -92,13 +92,9 @@
      */
     public static void removeLayerChangeListener(MapView.LayerChangeListener listener) {
-        if (listener != null && layerChangeListeners.contains(listener)) {
-            layerChangeListeners.remove(listener);
-        }
+        layerChangeListeners.remove(listener);
     }
 
     public static void removeEditLayerChangeListener(EditLayerChangeListener listener) {
-        if (listener != null && editLayerChangeListeners.contains(listener)) {
-            editLayerChangeListeners.remove(listener);
-        }
+        editLayerChangeListeners.remove(listener);
     }
 
@@ -111,12 +107,12 @@
      */
     public static void addLayerChangeListener(MapView.LayerChangeListener listener) {
-        if (listener != null && ! layerChangeListeners.contains(listener)) {
-            layerChangeListeners.add(listener);
+        if (listener != null) {
+            layerChangeListeners.addIfAbsent(listener);
         }
     }
 
     public static void addEditLayerChangeListener(EditLayerChangeListener listener) {
-        if (listener != null && ! layerChangeListeners.contains(listener)) {
-            editLayerChangeListeners.add(listener);
+        if (listener != null) {
+            editLayerChangeListeners.addIfAbsent(listener);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditor.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditor.java	(revision 2655)
@@ -45,13 +45,11 @@
 
     public void addNavigationListeners(NavigationListener listener) {
-        if (listener != null && ! (listeners.contains(listener))) {
-            listeners.add(listener);
+        if (listener != null) {
+            listeners.addIfAbsent(listener);
         }
     }
 
     public void removeavigationListeners(NavigationListener listener) {
-        if (listener != null && listeners.contains(listener)) {
-            listeners.remove(listener);
-        }
+        listeners.remove(listener);
     }
 
@@ -116,15 +114,15 @@
         }
         switch(decision.getDecisionType()) {
-            case UNDECIDED:
-                editor.setSelectedIndex(0);
-                break;
-            case KEEP_ONE:
-                editor.setSelectedItem(decision.getChosenValue());
-                break;
-            case KEEP_NONE:
-                editor.setSelectedItem(MultiValueDecisionType.KEEP_NONE);
-                break;
-            case KEEP_ALL:
-                editor.setSelectedItem(MultiValueDecisionType.KEEP_ALL);
+        case UNDECIDED:
+            editor.setSelectedIndex(0);
+            break;
+        case KEEP_ONE:
+            editor.setSelectedItem(decision.getChosenValue());
+            break;
+        case KEEP_NONE:
+            editor.setSelectedItem(MultiValueDecisionType.KEEP_NONE);
+            break;
+        case KEEP_ALL:
+            editor.setSelectedItem(MultiValueDecisionType.KEEP_ALL);
         }
     }
@@ -167,14 +165,14 @@
             } else if (MultiValueDecisionType.class.isInstance(value)) {
                 switch(MultiValueDecisionType.class.cast(value)) {
-                    case KEEP_NONE:
-                        setText(tr("none"));
-                        setFont(UIManager.getFont("ComboBox.font").deriveFont(Font.ITALIC + Font.BOLD));
-                        break;
-                    case KEEP_ALL:
-                        setText(tr("all"));
-                        setFont(UIManager.getFont("ComboBox.font").deriveFont(Font.ITALIC + Font.BOLD));
-                        break;
-                    default:
-                        // don't display other values
+                case KEEP_NONE:
+                    setText(tr("none"));
+                    setFont(UIManager.getFont("ComboBox.font").deriveFont(Font.ITALIC + Font.BOLD));
+                    break;
+                case KEEP_ALL:
+                    setText(tr("all"));
+                    setFont(UIManager.getFont("ComboBox.font").deriveFont(Font.ITALIC + Font.BOLD));
+                    break;
+                default:
+                    // don't display other values
                 }
             }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 2655)
@@ -14,5 +14,4 @@
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import javax.swing.AbstractAction;
@@ -35,4 +34,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
@@ -61,5 +61,5 @@
  */
 public class ChangesetDialog extends ToggleDialog{
-    static private final Logger logger = Logger.getLogger(ChangesetDialog.class.getName());
+    //static private final Logger logger = Logger.getLogger(ChangesetDialog.class.getName());
 
     private ChangesetInSelectionListModel inSelectionModel;
@@ -98,5 +98,4 @@
 
         ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
-        MapView.addLayerChangeListener(inActiveDataLayerModel);
 
         DblClickHandler dblClickHandler = new DblClickHandler();
@@ -114,5 +113,14 @@
         MapView.removeLayerChangeListener(inSelectionModel);
         DataSet.selListeners.remove(inSelectionModel);
-        MapView.removeLayerChangeListener(inActiveDataLayerModel);
+    }
+
+    @Override
+    public void showNotify() {
+        DatasetEventManager.getInstance().addDatasetListener(inActiveDataLayerModel, true);
+    }
+
+    @Override
+    public void hideNotify() {
+        DatasetEventManager.getInstance().removeDatasetListener(inActiveDataLayerModel);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 2655)
@@ -47,5 +47,4 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -285,6 +284,6 @@
 
         public void addListDataListener(ListDataListener l) {
-            if (l != null && ! listeners.contains(l)) {
-                listeners.add(l);
+            if (l != null) {
+                listeners.addIfAbsent(l);
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 2655)
@@ -642,8 +642,6 @@
          */
         public void addLayerListModelListener(LayerListModelListener listener) {
-            synchronized(listeners) {
-                if (listener != null && !listeners.contains(listener)) {
-                    listeners.add(listener);
-                }
+            if (listener != null) {
+                listeners.addIfAbsent(listener);
             }
         }
@@ -655,9 +653,5 @@
          */
         public void removeLayerListModelListener(LayerListModelListener listener) {
-            synchronized(listeners) {
-                if (listener != null && listeners.contains(listener)) {
-                    listeners.remove(listener);
-                }
-            }
+            listeners.remove(listener);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2655)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListener;
@@ -738,3 +739,5 @@
         }
     }
+
+    public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignore */}
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java	(revision 2655)
@@ -9,5 +9,4 @@
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import javax.swing.DefaultListModel;
@@ -20,9 +19,11 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Storage;
 
 public class ChangesetListModel extends DefaultListModel  implements ChangesetCacheListener{
-    static private final Logger logger = Logger.getLogger(ChangesetListModel.class.getName());
+    //static private final Logger logger = Logger.getLogger(ChangesetListModel.class.getName());
 
     private final List<Changeset> data = new ArrayList<Changeset>();
+    private final Storage<Changeset> shownChangesets = new Storage<Changeset>();
     private DefaultListSelectionModel selectionModel;
 
@@ -63,12 +64,30 @@
     }
 
+    protected void addChangeset(Changeset changeset) {
+        if (shownChangesets.add(changeset)) {
+            setChangesets(shownChangesets);
+            updateModel();
+        }
+    }
+
+    protected void removeChangeset(Changeset changeset) {
+        if (shownChangesets.remove(changeset)) {
+            setChangesets(shownChangesets);
+            updateModel();
+        }
+    }
+
     protected void setChangesets(Collection<Changeset> changesets) {
+        shownChangesets.clear();
+        if (changesets != null) {
+            shownChangesets.addAll(changesets);
+        }
+        updateModel();
+    }
+
+    private void updateModel() {
         Set<Changeset> sel = getSelectedChangesets();
         data.clear();
-        if (changesets == null) {
-            fireContentsChanged(this, 0, getSize());
-            return;
-        }
-        data.addAll(changesets);
+        data.addAll(shownChangesets);
         ChangesetCache cache = ChangesetCache.getInstance();
         for (Changeset cs: data) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 2655)
@@ -4,11 +4,18 @@
 import javax.swing.DefaultListSelectionModel;
 
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.DataChangeListener;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.ChangesetIdChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
+import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
+import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
+import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 
-public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements MapView.LayerChangeListener, DataChangeListener{
+public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener  {
 
     public ChangesetsInActiveDataLayerListModel(DefaultListSelectionModel selectionModel) {
@@ -16,32 +23,35 @@
     }
 
-    /* ---------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                */
-    /* ---------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (oldLayer != null && oldLayer instanceof OsmDataLayer) {
-            OsmDataLayer l = (OsmDataLayer)oldLayer;
-            l.listenerDataChanged.remove(this);
-        }
-        if (newLayer == null) {
-            setChangesets(null);
-        } else if (newLayer instanceof OsmDataLayer){
-            OsmDataLayer l = (OsmDataLayer)newLayer;
-            l.listenerDataChanged.add(this);
-            initFromDataSet(l.data);
-        } else {
-            setChangesets(null);
+    public void dataChanged(DataChangedEvent event) {
+        initFromPrimitives(event.getPrimitives());
+    }
+
+    public void nodeMoved(NodeMovedEvent event) {/* ignored */}
+
+    public void primtivesAdded(PrimitivesAddedEvent event) {
+        for (OsmPrimitive primitive:event.getPrimitives()) {
+            addChangeset(new Changeset(primitive.getChangesetId()));
         }
     }
-    public void layerAdded(Layer newLayer) {}
-    public void layerRemoved(Layer oldLayer) {}
 
-    /* ---------------------------------------------------------------------------- */
-    /* Interface DataChangeListener                                                 */
-    /* ---------------------------------------------------------------------------- */
-    public void dataChanged(OsmDataLayer l) {
-        if (l == null) return;
-        if (l != Main.main.getEditLayer()) return;
-        initFromDataSet(l.data);
+    public void primtivesRemoved(PrimitivesRemovedEvent event) {
+        for (OsmPrimitive primitive:event.getPrimitives()) {
+            removeChangeset(new Changeset(primitive.getChangesetId()));
+        }
     }
+
+    public void relationMembersChanged(RelationMembersChangedEvent event) {/* ignored */}
+
+    public void tagsChanged(TagsChangedEvent event) {/* ignored */}
+
+    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+        if (event instanceof ChangesetIdChangedEvent) {
+            ChangesetIdChangedEvent e = (ChangesetIdChangedEvent) event;
+            removeChangeset(new Changeset(e.getOldChangesetId()));
+            addChangeset(new Changeset(e.getNewChangesetId()));
+        }
+    }
+
+    public void wayNodesChanged(WayNodesChangedEvent event) {/* ignored */}
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2655)
@@ -33,4 +33,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListener;
@@ -131,27 +132,21 @@
 
     public void wayNodesChanged(WayNodesChangedEvent event) {/* ignore */}
+
+    public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignore */}
     /* --------------------------------------------------------------------------- */
 
     public void addMemberModelListener(IMemberModelListener listener) {
-        synchronized (listeners) {
-            if (listener != null && !listeners.contains(listener)) {
-                listeners.add(listener);
-            }
+        if (listener != null) {
+            listeners.addIfAbsent(listener);
         }
     }
 
     public void removeMemberModelListener(IMemberModelListener listener) {
-        synchronized (listeners) {
-            if (listener != null && listeners.contains(listener)) {
-                listeners.remove(listener);
-            }
-        }
+        listeners.remove(listener);
     }
 
     protected void fireMakeMemberVisible(int index) {
-        synchronized (listeners) {
-            for (IMemberModelListener listener : listeners) {
-                listener.makeMemberVisible(index);
-            }
+        for (IMemberModelListener listener : listeners) {
+            listener.makeMemberVisible(index);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java	(revision 2655)
@@ -4,5 +4,4 @@
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.logging.Logger;
 
 import javax.swing.event.TreeModelEvent;
@@ -24,5 +23,5 @@
  */
 public class RelationTreeModel implements TreeModel {
-    private static final Logger logger = Logger.getLogger(RelationTreeModel.class.getName());
+    //private static final Logger logger = Logger.getLogger(RelationTreeModel.class.getName());
 
     /** the root relation */
@@ -215,17 +214,11 @@
 
     public void addTreeModelListener(TreeModelListener l) {
-        synchronized (listeners) {
-            if (l != null && !listeners.contains(l)) {
-                listeners.add(l);
-            }
+        if (l != null) {
+            listeners.addIfAbsent(l);
         }
     }
 
     public void removeTreeModelListener(TreeModelListener l) {
-        synchronized (listeners) {
-            if (l != null && listeners.contains(l)) {
-                listeners.remove(l);
-            }
-        }
+        listeners.remove(l);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2655)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListener;
@@ -830,4 +831,8 @@
     }
 
+    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+        // Irrelevant
+    }
+
     /* ---------------------------------------------------------------------- */
     /* DataChangeListener                                                     */
Index: trunk/src/org/openstreetmap/josm/gui/io/FilenameCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/FilenameCellEditor.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/io/FilenameCellEditor.java	(revision 2655)
@@ -72,6 +72,6 @@
 
     public void addCellEditorListener(CellEditorListener l) {
-        if (!listeners.contains(l)) {
-            listeners.add(l);
+        if (l != null) {
+            listeners.addIfAbsent(l);
         }
     }
@@ -102,7 +102,5 @@
 
     public void removeCellEditorListener(CellEditorListener l) {
-        if (listeners.contains(l)) {
-            listeners.remove(l);
-        }
+        listeners.remove(l);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveFlagCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveFlagCellEditor.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveFlagCellEditor.java	(revision 2655)
@@ -37,6 +37,6 @@
 
     public void addCellEditorListener(CellEditorListener l) {
-        if (!listeners.contains(l)) {
-            listeners.add(l);
+        if (l != null) {
+            listeners.addIfAbsent(l);
         }
     }
@@ -67,7 +67,5 @@
 
     public void removeCellEditorListener(CellEditorListener l) {
-        if (listeners.contains(l)) {
-            listeners.remove(l);
-        }
+        listeners.remove(l);
     }
 
@@ -90,6 +88,6 @@
         SaveLayerInfo info = (SaveLayerInfo)value;
         switch(column) {
-            case 4: setInitialValue(info.isDoUploadToServer()); break;
-            case 5: setInitialValue(info.isDoSaveToFile()); break;
+        case 4: setInitialValue(info.isDoUploadToServer()); break;
+        case 5: setInitialValue(info.isDoSaveToFile()); break;
         }
         return this;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/StyleSourceEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/StyleSourceEditor.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/StyleSourceEditor.java	(revision 2655)
@@ -859,6 +859,6 @@
 
         public void addCellEditorListener(CellEditorListener l) {
-            if (!listeners.contains(l)) {
-                listeners.add(l);
+            if (l != null) {
+                listeners.addIfAbsent(l);
             }
         }
@@ -891,7 +891,5 @@
 
         public void removeCellEditorListener(CellEditorListener l) {
-            if (listeners.contains(l)) {
-                listeners.remove(l);
-            }
+            listeners.remove(l);
         }
 
Index: trunk/src/org/openstreetmap/josm/io/NmeaReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 2654)
+++ trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 2655)
@@ -272,5 +272,6 @@
                         e[GPGGA.LONGITUDE.position]
                 );
-                if(latLon==null) throw(null); // malformed
+                if(latLon==null)
+                    throw new NullPointerException(); // malformed
 
                 if((latLon.lat()==0.0) && (latLon.lon()==0.0)) {
