Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2438)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2439)
@@ -47,4 +47,5 @@
     private Storage<OsmPrimitive> allPrimitives = new Storage<OsmPrimitive>(new IdHash());
     private Map<PrimitiveId, OsmPrimitive> primitivesMap = allPrimitives.foreignKey(new IdHash());
+    private List<DataSetListener> listeners = new ArrayList<DataSetListener>();
 
     /**
@@ -191,4 +192,5 @@
         allPrimitives.add(primitive);
         primitive.setDataset(this);
+        firePrimitivesAdded(Collections.singletonList(primitive));
     }
 
@@ -232,4 +234,5 @@
         allPrimitives.remove(primitive);
         primitive.setDataset(null);
+        firePrimitivesRemoved(Collections.singletonList(primitive));
     }
 
@@ -784,12 +787,49 @@
     }
 
+
+    public void addDataSetListener(DataSetListener dsl) {
+        listeners.add(dsl);
+    }
+
+    public void removeDataSetListener(DataSetListener dsl) {
+        listeners.remove(dsl);
+    }
+
+    void firePrimitivesAdded(Collection<? extends OsmPrimitive> added) {
+        for (DataSetListener dsl : listeners) {
+            dsl.primtivesAdded(added);
+        }
+    }
+
+    void firePrimitivesRemoved(Collection<? extends OsmPrimitive> removed) {
+        for (DataSetListener dsl : listeners) {
+            dsl.primtivesRemoved(removed);
+        }
+    }
+
+    void fireTagsChanged(OsmPrimitive prim) {
+        for (DataSetListener dsl : listeners) {
+            dsl.tagsChanged(prim);
+        }
+    }
+
+    void fireRelationMembersChanged(Relation r) {
+        for (DataSetListener dsl : listeners) {
+            dsl.relationMembersChanged(r);
+        }
+    }
+
     public void fireNodeMoved(Node node) {
-        // TODO Fire event
         reindexNode(node);
+        for (DataSetListener dsl : listeners) {
+            dsl.nodeMoved(node);
+        }
     }
 
     public void fireWayNodesChanged(Way way) {
-        // TODO Fire event
         reindexWay(way);
+        for (DataSetListener dsl : listeners) {
+            dsl.wayNodesChanged(way);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSetListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSetListener.java	(revision 2439)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSetListener.java	(revision 2439)
@@ -0,0 +1,76 @@
+/*
+ *  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
+     */
+    public 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
+     */
+    public 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.
+     */
+    public void tagsChanged(OsmPrimitive prim);
+
+    /**
+     * A node's coordinates were modified.
+     * @param node The node that was moved.
+     */
+    public void nodeMoved(Node node);
+
+    /**
+     * A way's node list was changed.
+     * @param way The way that was modified.
+     */
+    public void wayNodesChanged(Way way);
+
+    /**
+     * A relation's members have changed.
+     * @param relation The relation that was modified.
+     */
+    public void relationMembersChanged(Relation r);
+
+
+}
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2438)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2439)
@@ -492,4 +492,11 @@
         }
         setModified(deleted);
+        if (dataSet != null) {
+            if (deleted) {
+                dataSet.firePrimitivesRemoved(Collections.singleton(this));
+            } else {
+                dataSet.firePrimitivesAdded(Collections.singleton(this));
+            }
+        }
     }
 
@@ -774,4 +781,7 @@
         updateHasDirectionKeys();
         updateTagged();
+        if (dataSet != null) {
+            dataSet.fireTagsChanged(this);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2438)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2439)
@@ -52,4 +52,5 @@
         }
 
+        fireMembersChanged();
     }
 
@@ -80,4 +81,5 @@
         members.add(member);
         member.getMember().addReferrer(this);
+        fireMembersChanged();
     }
 
@@ -91,4 +93,5 @@
         members.add(index, member);
         member.getMember().addReferrer(this);
+        fireMembersChanged();
     }
 
@@ -105,4 +108,5 @@
             member.getMember().addReferrer(this);
             result.getMember().removeReferrer(this);
+            fireMembersChanged();
         }
         return result;
@@ -123,4 +127,5 @@
         }
         result.getMember().removeReferrer(this);
+        fireMembersChanged();
         return result;
     }
@@ -264,4 +269,5 @@
         primitive.removeReferrer(this);
         members.removeAll(todelete);
+        fireMembersChanged();
     }
 
@@ -298,4 +304,5 @@
             primitive.removeReferrer(this);
         }
+        fireMembersChanged();
     }
 
@@ -335,3 +342,9 @@
         // Do nothing for now
     }
+
+    private void fireMembersChanged() {
+        if (getDataSet() != null) {
+            getDataSet().fireRelationMembersChanged(this);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2438)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2439)
@@ -35,8 +35,11 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
+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.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
@@ -44,5 +47,4 @@
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.gui.layer.DataChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -59,5 +61,5 @@
  * objects are visible on the map and can be selected there. Relations are not.
  */
-public class RelationListDialog extends ToggleDialog implements LayerChangeListener, DataChangeListener {
+public class RelationListDialog extends ToggleDialog implements LayerChangeListener, DataSetListener {
     private static final Logger logger = Logger.getLogger(RelationListDialog.class.getName());
 
@@ -201,5 +203,5 @@
     public void layerRemoved(Layer a) {
         if (a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).listenerDataChanged.remove(this);
+            ((OsmDataLayer)a).data.removeDataSetListener(this);
         }
         updateList();
@@ -208,10 +210,6 @@
     public void layerAdded(Layer a) {
         if (a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).listenerDataChanged.add(this);
-        }
-    }
-
-    public void dataChanged(OsmDataLayer l) {
-        updateList();
+            ((OsmDataLayer)a).data.addDataSetListener(this);
+        }
     }
 
@@ -677,3 +675,23 @@
         }
     }
+
+    public void nodeMoved(Node node) { }
+
+    public void wayNodesChanged(Way way) { }
+
+    public void primtivesAdded(Collection<? extends OsmPrimitive> added) {
+        updateList();
+    }
+
+    public void primtivesRemoved(Collection<? extends OsmPrimitive> removed) {
+        updateList();
+    }
+
+    public void relationMembersChanged(Relation r) {
+        updateList();
+    }
+
+    public void tagsChanged(OsmPrimitive prim) {
+        updateList();
+    }
 }
