Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2621)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2622)
@@ -20,4 +20,13 @@
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+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;
 
 
@@ -816,60 +825,40 @@
     }
 
-    private void fireDataChanged() {
+    private void fireEvent(AbstractDatasetChangedEvent event) {
         if (updateCount == 0) {
             for (DataSetListener dsl : listeners) {
-                dsl.dataChanged();
-            }
-        }
+                event.fire(dsl);
+            }
+        }
+    }
+
+    private void fireDataChanged() {
+        fireEvent(new DataChangedEvent(this));
     }
 
     void firePrimitivesAdded(Collection<? extends OsmPrimitive> added) {
-        if (updateCount == 0) {
-            for (DataSetListener dsl : listeners) {
-                dsl.primtivesAdded(added);
-            }
-        }
+        fireEvent(new PrimitivesAddedEvent(this, added));
     }
 
     void firePrimitivesRemoved(Collection<? extends OsmPrimitive> removed) {
-        if (updateCount == 0) {
-            for (DataSetListener dsl : listeners) {
-                dsl.primtivesRemoved(removed);
-            }
-        }
+        fireEvent(new PrimitivesRemovedEvent(this, removed));
     }
 
     void fireTagsChanged(OsmPrimitive prim) {
-        if (updateCount == 0) {
-            for (DataSetListener dsl : listeners) {
-                dsl.tagsChanged(prim);
-            }
-        }
+        fireEvent(new TagsChangedEvent(this, prim));
     }
 
     void fireRelationMembersChanged(Relation r) {
-        if (updateCount == 0) {
-            for (DataSetListener dsl : listeners) {
-                dsl.relationMembersChanged(r);
-            }
-        }
+        fireEvent(new RelationMembersChangedEvent(this, r));
     }
 
     void fireNodeMoved(Node node) {
         reindexNode(node);
-        if (updateCount == 0) {
-            for (DataSetListener dsl : listeners) {
-                dsl.nodeMoved(node);
-            }
-        }
+        fireEvent(new NodeMovedEvent(this, node));
     }
 
     void fireWayNodesChanged(Way way) {
         reindexWay(way);
-        if (updateCount == 0) {
-            for (DataSetListener dsl : listeners) {
-                dsl.wayNodesChanged(way);
-            }
-        }
+        fireEvent(new WayNodesChangedEvent(this, way));
     }
 
Index: unk/src/org/openstreetmap/josm/data/osm/DataSetListener.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSetListener.java	(revision 2621)
+++ 	(revision )
@@ -1,81 +1,0 @@
-/*
- *  JOSMng - a Java Open Street Map editor, the next generation.
-
- *
- *  Copyright (C) 2008 Petr Nejedly <P.Nejedly@sh.cvut.cz>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
-
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-
-package org.openstreetmap.josm.data.osm;
-
-import java.util.Collection;
-
-/**
- * A listener listening for all DataSet changes.
- * INCOMPLETE (missing relation-related events)!
- *
- * @author nenik
- */
-public interface DataSetListener {
-    /**
-     * A bunch of primitives were added into the DataSet, or existing
-     * deleted/invisible primitives were resurrected.
-     *
-     * @param added A collection of newly-visible primitives
-     */
-    void primtivesAdded(Collection<? extends OsmPrimitive> added);
-
-    /**
-     * A bunch of primitives were removed from the DataSet, or preexisting
-     * primitives were marked as deleted.
-     *
-     * @param removed A collection of newly-invisible primitives
-     */
-    void primtivesRemoved(Collection<? extends OsmPrimitive> removed);
-
-    /**
-     * There was some change in the tag set of a primitive. It can have been
-     * a tag addition, tag removal or change in tag value.
-     *
-     * @param prim the primitive, whose tags were affected.
-     */
-    void tagsChanged(OsmPrimitive prim);
-
-    /**
-     * A node's coordinates were modified.
-     * @param node The node that was moved.
-     */
-    void nodeMoved(Node node);
-
-    /**
-     * A way's node list was changed.
-     * @param way The way that was modified.
-     */
-    void wayNodesChanged(Way way);
-
-    /**
-     * A relation's members have changed.
-     * @param relation The relation that was modified.
-     */
-    void relationMembersChanged(Relation r);
-
-    /**
-     * 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();
-
-}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java	(revision 2622)
@@ -0,0 +1,25 @@
+// 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 abstract class AbstractDatasetChangedEvent {
+
+    protected final DataSet dataSet;
+
+    protected AbstractDatasetChangedEvent(DataSet dataSet) {
+        this.dataSet = dataSet;
+    }
+
+    public abstract void fire(DataSetListener listener);
+    public abstract List<? extends OsmPrimitive> getPrimitives();
+
+    public DataSet getDataset() {
+        return dataSet;
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/DataChangedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/DataChangedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/DataChangedEvent.java	(revision 2622)
@@ -0,0 +1,26 @@
+// 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 DataChangedEvent extends AbstractDatasetChangedEvent {
+
+    public DataChangedEvent(DataSet dataSet) {
+        super(dataSet);
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.dataChanged(this);
+    }
+
+    @Override
+    public List<OsmPrimitive> getPrimitives() {
+        return dataSet.allPrimitives();
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java	(revision 2622)
@@ -0,0 +1,80 @@
+/*
+ *  JOSMng - a Java Open Street Map editor, the next generation.
+
+ *
+ *  Copyright (C) 2008 Petr Nejedly <P.Nejedly@sh.cvut.cz>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+package org.openstreetmap.josm.data.osm.event;
+
+
+/**
+ * A listener listening for all DataSet changes.
+ * INCOMPLETE (missing relation-related events)!
+ *
+ * @author nenik
+ */
+public interface DataSetListener {
+    /**
+     * A bunch of primitives were added into the DataSet, or existing
+     * deleted/invisible primitives were resurrected.
+     *
+     * @param added A collection of newly-visible primitives
+     */
+    void primtivesAdded(PrimitivesAddedEvent event);
+
+    /**
+     * A bunch of primitives were removed from the DataSet, or preexisting
+     * primitives were marked as deleted.
+     *
+     * @param removed A collection of newly-invisible primitives
+     */
+    void primtivesRemoved(PrimitivesRemovedEvent event);
+
+    /**
+     * There was some change in the tag set of a primitive. It can have been
+     * a tag addition, tag removal or change in tag value.
+     *
+     * @param prim the primitive, whose tags were affected.
+     */
+    void tagsChanged(TagsChangedEvent event);
+
+    /**
+     * A node's coordinates were modified.
+     * @param node The node that was moved.
+     */
+    void nodeMoved(NodeMovedEvent event);
+
+    /**
+     * A way's node list was changed.
+     * @param way The way that was modified.
+     */
+    void wayNodesChanged(WayNodesChangedEvent event);
+
+    /**
+     * A relation's members have changed.
+     * @param relation The relation that was modified.
+     */
+    void relationMembersChanged(RelationMembersChangedEvent 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 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListenerAdapter.java	(revision 2622)
@@ -0,0 +1,44 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+public class DataSetListenerAdapter implements DataSetListener {
+
+    public interface Listener {
+        void processDatasetEvent(AbstractDatasetChangedEvent event);
+    }
+
+    private final Listener listener;
+
+    public DataSetListenerAdapter(Listener listener) {
+        this.listener = listener;
+    }
+
+    public void dataChanged(DataChangedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+    public void nodeMoved(NodeMovedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+    public void primtivesAdded(PrimitivesAddedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+    public void primtivesRemoved(PrimitivesRemovedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+    public void relationMembersChanged(RelationMembersChangedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+    public void tagsChanged(TagsChangedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+    public void wayNodesChanged(WayNodesChangedEvent event) {
+        listener.processDatasetEvent(event);
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 2622)
@@ -0,0 +1,94 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import javax.swing.SwingUtilities;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+
+/**
+ * This class allows to add DatasetListener to currently active dataset. If active
+ * layer is changed, listeners are automatically registered at new active dataset
+ * (it's no longer necessary to register for layer events and reregister every time
+ * new layer is selected)
+ * 
+ * Events in EDT are supported, see {@link #addDatasetListener(DataSetListener, boolean)}
+ *
+ */
+public class DatasetEventManager implements LayerChangeListener, Listener {
+
+    private static final DatasetEventManager instance = new DatasetEventManager();
+
+    public static DatasetEventManager getInstance() {
+        return instance;
+    }
+
+    private final Queue<AbstractDatasetChangedEvent> eventsInEDT = new LinkedBlockingQueue<AbstractDatasetChangedEvent>();
+    private final List<DataSetListener> inEDTListeners = new ArrayList<DataSetListener>();
+    private final List<DataSetListener> normalListeners = new ArrayList<DataSetListener>();
+    private final DataSetListener myListener = new DataSetListenerAdapter(this);
+
+    public DatasetEventManager() {
+        MapView.addLayerChangeListener(this);
+    }
+
+    /**
+     * Register listener, that will receive events from currently active dataset
+     * @param listener
+     * @param fireInEDT If true, listener will be notified in event dispatch thread
+     * instead of thread that caused the dataset change
+     */
+    public void addDatasetListener(DataSetListener listener, boolean fireInEDT) {
+        if (fireInEDT) {
+            inEDTListeners.add(listener);
+        } else {
+            normalListeners.add(listener);
+        }
+    }
+
+    public void removeDatasetListener(DataSetListener listener) {
+        inEDTListeners.remove(listener);
+        normalListeners.remove(listener);
+    }
+
+    public void activeLayerChange(Layer a, Layer b) {
+        if (a != null && a instanceof OsmDataLayer) {
+            ((OsmDataLayer)a).data.removeDataSetListener(myListener);
+        }
+        if (b != null && b instanceof OsmDataLayer) {
+            ((OsmDataLayer)b).data.addDataSetListener(myListener);
+        }
+        processDatasetEvent(new DataChangedEvent(Main.main.getEditLayer().data));
+    }
+    public void layerRemoved(Layer a) {/* irrelevant in this context */}
+    public void layerAdded(Layer a) {/* irrelevant in this context */}
+
+    public void processDatasetEvent(AbstractDatasetChangedEvent event) {
+        for (DataSetListener listener: normalListeners) {
+            event.fire(listener);
+        }
+        eventsInEDT.add(event);
+        SwingUtilities.invokeLater(edtRunnable);
+    }
+
+    private final Runnable edtRunnable = new Runnable() {
+        public void run() {
+            AbstractDatasetChangedEvent event = null;
+            while ((event = eventsInEDT.poll()) != null) {
+                for (DataSetListener listener: inEDTListeners) {
+                    event.fire(listener);
+                }
+            }
+        }
+    };
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/NodeMovedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/NodeMovedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/NodeMovedEvent.java	(revision 2622)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public class NodeMovedEvent extends AbstractDatasetChangedEvent {
+
+    private final Node node;
+
+    public NodeMovedEvent(DataSet dataSet, Node node) {
+        super(dataSet);
+        this.node = node;
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.nodeMoved(this);
+    }
+
+    public Node getNode() {
+        return node;
+    }
+
+    @Override
+    public List<? extends OsmPrimitive> getPrimitives() {
+        return Collections.singletonList(node);
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/PrimitivesAddedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/PrimitivesAddedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/PrimitivesAddedEvent.java	(revision 2622)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public class PrimitivesAddedEvent extends AbstractDatasetChangedEvent {
+
+    private final List<? extends OsmPrimitive> primitives;
+
+    public PrimitivesAddedEvent(DataSet dataSet, Collection<? extends OsmPrimitive> primitives) {
+        super(dataSet);
+        this.primitives = Collections.unmodifiableList(new ArrayList<OsmPrimitive>(primitives));
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.primtivesAdded(this);
+    }
+
+    public List<? extends OsmPrimitive> getPrimitives() {
+        return primitives;
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/PrimitivesRemovedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/PrimitivesRemovedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/PrimitivesRemovedEvent.java	(revision 2622)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public class PrimitivesRemovedEvent extends AbstractDatasetChangedEvent {
+
+    private final List<? extends OsmPrimitive> primitives;
+
+    public PrimitivesRemovedEvent(DataSet dataSet, Collection<? extends OsmPrimitive> primitives) {
+        super(dataSet);
+        this.primitives = Collections.unmodifiableList(new ArrayList<OsmPrimitive>(primitives));
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.primtivesRemoved(this);
+    }
+
+    public List<? extends OsmPrimitive> getPrimitives() {
+        return primitives;
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/RelationMembersChangedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/RelationMembersChangedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/RelationMembersChangedEvent.java	(revision 2622)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+
+public class RelationMembersChangedEvent extends AbstractDatasetChangedEvent {
+
+    private final Relation relation;
+
+    public RelationMembersChangedEvent(DataSet dataSet, Relation relation) {
+        super(dataSet);
+        this.relation = relation;
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.relationMembersChanged(this);
+    }
+
+    public Relation getRelation() {
+        return relation;
+    }
+
+    @Override
+    public List<? extends OsmPrimitive> getPrimitives() {
+        return Collections.singletonList(relation);
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/TagsChangedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/TagsChangedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/TagsChangedEvent.java	(revision 2622)
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+public class TagsChangedEvent extends AbstractDatasetChangedEvent {
+
+    private final OsmPrimitive primitive;
+
+    public TagsChangedEvent(DataSet dataSet, OsmPrimitive primitive) {
+        super(dataSet);
+        this.primitive = primitive;
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.tagsChanged(this);
+    }
+
+    public OsmPrimitive getPrimitive() {
+        return primitive;
+    }
+
+    @Override
+    public List<? extends OsmPrimitive> getPrimitives() {
+        return Collections.singletonList(primitive);
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/WayNodesChangedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/WayNodesChangedEvent.java	(revision 2622)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/WayNodesChangedEvent.java	(revision 2622)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class WayNodesChangedEvent extends AbstractDatasetChangedEvent {
+
+    private final Way way;
+
+    public WayNodesChangedEvent(DataSet dataSet, Way way) {
+        super(dataSet);
+        this.way = way;
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.wayNodesChanged(this);
+    }
+
+    public Way getChangedWay() {
+        return way;
+    }
+
+    @Override
+    public List<? extends OsmPrimitive> getPrimitives() {
+        return Collections.singletonList(way);
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2621)
+++ /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2622)
@@ -246,7 +246,5 @@
         if (layer instanceof OsmDataLayer || activeLayer == null) {
             // autoselect the new layer
-            Layer old = activeLayer;
             setActiveLayer(layer);
-            fireActiveLayerChanged(old, layer);
         }
         layer.addPropertyChangeListener(this);
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2621)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2622)
@@ -33,16 +33,21 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSetListener;
 import org.openstreetmap.josm.data.osm.NameFormatter;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
+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;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
@@ -140,10 +145,6 @@
         MapView.addLayerChangeListener(this);
         MapView.addLayerChangeListener(newAction);
-        // Register as a data set listener for the current edit layer only.
-        // See also activeLayerChanged
-        if (Main.main.getEditLayer() != null) {
-            Main.main.getEditLayer().data.addDataSetListener(this);
-        }
-        dataChanged();
+        DatasetEventManager.getInstance().addDatasetListener(this, true);
+        dataChanged(Main.main.getEditLayer());
     }
 
@@ -151,9 +152,5 @@
         MapView.removeLayerChangeListener(this);
         MapView.removeLayerChangeListener(newAction);
-        // unregistering from *all* data layer is somewhat overkill but it
-        // doesn't harm either.
-        for (OsmDataLayer layer:Main.map.mapView.getLayersOfType(OsmDataLayer.class)) {
-            layer.data.removeDataSetListener(this);
-        }
+        DatasetEventManager.getInstance().removeDatasetListener(this);
     }
 
@@ -701,11 +698,8 @@
     /* ---------------------------------------------------------------------------------- */
     public void activeLayerChange(Layer a, Layer b) {
-        initFromLayer(b);
         if (a != null && a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).data.removeDataSetListener(this);
             ((OsmDataLayer)a).listenerDataChanged.remove(this);
         }
         if (b != null && b instanceof OsmDataLayer) {
-            ((OsmDataLayer)b).data.addDataSetListener(this);
             ((OsmDataLayer)b).listenerDataChanged.add(this);
         }
@@ -719,72 +713,37 @@
     /* ---------------------------------------------------------------------------------- */
 
-    public void nodeMoved(Node node) {/* irrelevant in this context */}
-
-    public void wayNodesChanged(Way way) {/* irrelevant in this context */}
-
-    public void primtivesAdded(final Collection<? extends OsmPrimitive> added) {
-        Runnable task = new Runnable() {
-            public void run() {
-                model.addRelations(added);
-            }
-        };
-        if (SwingUtilities.isEventDispatchThread()) {
-            task.run();
-        } else {
-            SwingUtilities.invokeLater(task);
-        }
-    }
-
-    public void primtivesRemoved(final Collection<? extends OsmPrimitive> removed) {
-        Runnable task = new Runnable() {
-            public void run() {
-                model.removeRelations(removed);
-            }
-        };
-        if (SwingUtilities.isEventDispatchThread()) {
-            task.run();
-        } else {
-            SwingUtilities.invokeLater(task);
-        }
-    }
-
-    public void relationMembersChanged(final Relation r) {
-        Runnable task = new Runnable() {
-            public void run() {
-                List<Relation> sel = model.getSelectedRelations();
-                model.sort();
-                model.setSelectedRelations(sel);
-                displaylist.repaint();
-            }
-        };
-        if (SwingUtilities.isEventDispatchThread()) {
-            task.run();
-        } else {
-            SwingUtilities.invokeLater(task);
-        }
-    }
-
-    public void tagsChanged(OsmPrimitive prim) {
+    public void nodeMoved(NodeMovedEvent event) {/* irrelevant in this context */}
+
+    public void wayNodesChanged(WayNodesChangedEvent event) {/* irrelevant in this context */}
+
+    public void primtivesAdded(final PrimitivesAddedEvent event) {
+        model.addRelations(event.getPrimitives());
+    }
+
+    public void primtivesRemoved(final PrimitivesRemovedEvent event) {
+        model.removeRelations(event.getPrimitives());
+    }
+
+    public void relationMembersChanged(final RelationMembersChangedEvent event) {
+        List<Relation> sel = model.getSelectedRelations();
+        model.sort();
+        model.setSelectedRelations(sel);
+        displaylist.repaint();
+    }
+
+    public void tagsChanged(TagsChangedEvent event) {
+        OsmPrimitive prim = event.getPrimitive();
         if (prim == null || ! (prim instanceof Relation))
             return;
-        Runnable task = new Runnable() {
-            public void run() {
-                // trigger a sort of the relation list because the display name may
-                // have changed
-                //
-                List<Relation> sel = model.getSelectedRelations();
-                model.sort();
-                model.setSelectedRelations(sel);
-                displaylist.repaint();
-            }
-        };
-        if (SwingUtilities.isEventDispatchThread()) {
-            task.run();
-        } else {
-            SwingUtilities.invokeLater(task);
-        }
-    }
-
-    public void dataChanged() {
+        // trigger a sort of the relation list because the display name may
+        // have changed
+        //
+        List<Relation> sel = model.getSelectedRelations();
+        model.sort();
+        model.setSelectedRelations(sel);
+        displaylist.repaint();
+    }
+
+    public void dataChanged(DataChangedEvent event) {
         Layer l = Main.main.getEditLayer();
         if (l != null) {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2621)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2622)
@@ -28,5 +28,4 @@
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.DataSetListener;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -34,4 +33,12 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+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;
 import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
@@ -88,5 +95,5 @@
     /* Interface DataSetListener                                                   */
     /* --------------------------------------------------------------------------- */
-    public void dataChanged() {
+    public void dataChanged(DataChangedEvent event) {
         // just trigger a repaint - the display name of the relation members may
         // have changed
@@ -96,8 +103,8 @@
     }
 
-    public void nodeMoved(Node node) {/* ignore */}
-    public void primtivesAdded(Collection<? extends OsmPrimitive> added) {/* ignore */}
-
-    public void primtivesRemoved(Collection<? extends OsmPrimitive> removed) {
+    public void nodeMoved(NodeMovedEvent event) {/* ignore */}
+    public void primtivesAdded(PrimitivesAddedEvent event) {/* ignore */}
+
+    public void primtivesRemoved(PrimitivesRemovedEvent event) {
         // ignore - the relation in the editor might become out of sync with the relation
         // in the dataset. We will deal with it when the relation editor is closed or
@@ -105,5 +112,5 @@
     }
 
-    public void relationMembersChanged(Relation r) {
+    public void relationMembersChanged(RelationMembersChangedEvent event) {
         // ignore - the relation in the editor might become out of sync with the relation
         // in the dataset. We will deal with it when the relation editor is closed or
@@ -111,10 +118,10 @@
     }
 
-    public void tagsChanged(OsmPrimitive prim) {
+    public void tagsChanged(TagsChangedEvent event) {
         // just refresh the respective table cells
         //
         Collection<RelationMember> sel = getSelectedMembers();
         for (int i=0; i < members.size();i++) {
-            if (members.get(i).getMember() == prim) {
+            if (members.get(i).getMember() == event.getPrimitive()) {
                 fireTableCellUpdated(i, 1 /* the column with the primitive name */);
             }
@@ -123,5 +130,5 @@
     }
 
-    public void wayNodesChanged(Way way) {/* ignore */}
+    public void wayNodesChanged(WayNodesChangedEvent event) {/* ignore */}
     /* --------------------------------------------------------------------------- */
 
Index: /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2621)
+++ /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2622)
@@ -5,14 +5,11 @@
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Observable;
-import java.util.logging.Logger;
 
 import javax.swing.table.DefaultTableModel;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSetListener;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -23,4 +20,12 @@
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.Way;
+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;
 import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryNode;
@@ -30,4 +35,5 @@
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -59,7 +65,6 @@
  * @see HistoryBrowser
  */
-public class HistoryBrowserModel extends Observable implements MapView.LayerChangeListener, DataSetListener, DataChangeListener {
-
-    private static Logger logger = Logger.getLogger(HistoryBrowserModel.class.getName());
+public class HistoryBrowserModel extends Observable implements LayerChangeListener, DataSetListener, DataChangeListener {
+    //private static Logger logger = Logger.getLogger(HistoryBrowserModel.class.getName());
 
     /** the history of an OsmPrimitive */
@@ -777,5 +782,6 @@
     /* DataSetListener                                                        */
     /* ---------------------------------------------------------------------- */
-    public void nodeMoved(Node node) {
+    public void nodeMoved(NodeMovedEvent event) {
+        Node node = event.getNode();
         if (!node.isNew() && node.getId() == history.getId()) {
             setLatest(new HistoryPrimitiveBuilder().build(node));
@@ -783,7 +789,6 @@
     }
 
-    public void primtivesAdded(Collection<? extends OsmPrimitive> added) {
-        if (added == null || added.isEmpty()) return;
-        for (OsmPrimitive p: added) {
+    public void primtivesAdded(PrimitivesAddedEvent event) {
+        for (OsmPrimitive p: event.getPrimitives()) {
             if (canShowAsLatest(p)) {
                 setLatest(new HistoryPrimitiveBuilder().build(p));
@@ -792,7 +797,6 @@
     }
 
-    public void primtivesRemoved(Collection<? extends OsmPrimitive> removed) {
-        if (removed == null || removed.isEmpty()) return;
-        for (OsmPrimitive p: removed) {
+    public void primtivesRemoved(PrimitivesRemovedEvent event) {
+        for (OsmPrimitive p: event.getPrimitives()) {
             if (!p.isNew() && p.getId() == history.getId()) {
                 setLatest(null);
@@ -801,5 +805,6 @@
     }
 
-    public void relationMembersChanged(Relation r) {
+    public void relationMembersChanged(RelationMembersChangedEvent event) {
+        Relation r = event.getRelation();
         if (!r.isNew() && r.getId() == history.getId()) {
             setLatest(new HistoryPrimitiveBuilder().build(r));
@@ -807,5 +812,6 @@
     }
 
-    public void tagsChanged(OsmPrimitive prim) {
+    public void tagsChanged(TagsChangedEvent event) {
+        OsmPrimitive prim = event.getPrimitive();
         if (!prim.isNew() && prim.getId() == history.getId()) {
             setLatest(new HistoryPrimitiveBuilder().build(prim));
@@ -813,5 +819,6 @@
     }
 
-    public void wayNodesChanged(Way way) {
+    public void wayNodesChanged(WayNodesChangedEvent event) {
+        Way way = event.getChangedWay();
         if (!way.isNew() && way.getId() == history.getId()) {
             setLatest(new HistoryPrimitiveBuilder().build(way));
@@ -819,10 +826,10 @@
     }
 
-    public void dataChanged() {
+    public void dataChanged(DataChangedEvent event) {
         dataChanged(getEditLayer());
     }
 
     /* ---------------------------------------------------------------------- */
-    /* DataChangeListener                                                    */
+    /* DataChangeListener                                                     */
     /* ---------------------------------------------------------------------- */
     public void dataChanged(OsmDataLayer l) {
