Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2622)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2623)
@@ -203,5 +203,5 @@
         allPrimitives.add(primitive);
         primitive.setDataset(this);
-        firePrimitivesAdded(Collections.singletonList(primitive));
+        firePrimitivesAdded(Collections.singletonList(primitive), false);
     }
 
@@ -246,5 +246,5 @@
         primitive.setDataset(null);
         errors.remove(primitive);
-        firePrimitivesRemoved(Collections.singletonList(primitive));
+        firePrimitivesRemoved(Collections.singletonList(primitive), false);
     }
 
@@ -837,10 +837,10 @@
     }
 
-    void firePrimitivesAdded(Collection<? extends OsmPrimitive> added) {
-        fireEvent(new PrimitivesAddedEvent(this, added));
-    }
-
-    void firePrimitivesRemoved(Collection<? extends OsmPrimitive> removed) {
-        fireEvent(new PrimitivesRemovedEvent(this, removed));
+    void firePrimitivesAdded(Collection<? extends OsmPrimitive> added, boolean wasIncomplete) {
+        fireEvent(new PrimitivesAddedEvent(this, added, wasIncomplete));
+    }
+
+    void firePrimitivesRemoved(Collection<? extends OsmPrimitive> removed, boolean wasComplete) {
+        fireEvent(new PrimitivesRemovedEvent(this, removed, wasComplete));
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2622)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2623)
@@ -564,7 +564,7 @@
         if (dataSet != null) {
             if (deleted) {
-                dataSet.firePrimitivesRemoved(Collections.singleton(this));
+                dataSet.firePrimitivesRemoved(Collections.singleton(this), false);
             } else {
-                dataSet.firePrimitivesAdded(Collections.singleton(this));
+                dataSet.firePrimitivesAdded(Collections.singleton(this), false);
             }
         }
@@ -956,4 +956,6 @@
      */
     public void cloneFrom(OsmPrimitive other) {
+        if (id != other.id && dataSet != null)
+            throw new DataIntegrityProblemException("Osm id cannot be changed after primitive was added to the dataset");
         setKeys(other.getKeys());
         id = other.id;
@@ -1210,4 +1212,11 @@
 
     private void setIncomplete(boolean incomplete) {
+        if (dataSet != null && incomplete != this.incomplete) {
+            if (incomplete) {
+                dataSet.firePrimitivesRemoved(Collections.singletonList(this), true);
+            } else {
+                dataSet.firePrimitivesAdded(Collections.singletonList(this), true);
+            }
+        }
         this.incomplete = incomplete;
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2622)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2623)
@@ -217,4 +217,6 @@
         result.append(" version=");
         result.append(getVersion());
+        result.append(" ");
+        result.append(getFlagsAsString());
         result.append(" [");
         for (RelationMember rm:getMembers()) {
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 2623)
@@ -13,8 +13,10 @@
 
     private final List<? extends OsmPrimitive> primitives;
+    private final boolean wasIncomplete;
 
-    public PrimitivesAddedEvent(DataSet dataSet, Collection<? extends OsmPrimitive> primitives) {
+    public PrimitivesAddedEvent(DataSet dataSet, Collection<? extends OsmPrimitive> primitives, boolean wasIncomplete) {
         super(dataSet);
         this.primitives = Collections.unmodifiableList(new ArrayList<OsmPrimitive>(primitives));
+        this.wasIncomplete = wasIncomplete;
     }
 
@@ -24,7 +26,16 @@
     }
 
+    @Override
     public List<? extends OsmPrimitive> getPrimitives() {
         return primitives;
     }
 
+    /**
+     * 
+     * @return True if primitive was in dataset before (so it's not really added), but it was incomplete
+     */
+    public boolean wasIncomplete() {
+        return wasIncomplete;
+    }
+
 }
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 2623)
@@ -13,8 +13,10 @@
 
     private final List<? extends OsmPrimitive> primitives;
+    private final boolean wasComplete;
 
-    public PrimitivesRemovedEvent(DataSet dataSet, Collection<? extends OsmPrimitive> primitives) {
+    public PrimitivesRemovedEvent(DataSet dataSet, Collection<? extends OsmPrimitive> primitives, boolean wasComplete) {
         super(dataSet);
         this.primitives = Collections.unmodifiableList(new ArrayList<OsmPrimitive>(primitives));
+        this.wasComplete = wasComplete;
     }
 
@@ -24,7 +26,16 @@
     }
 
+    @Override
     public List<? extends OsmPrimitive> getPrimitives() {
         return primitives;
     }
 
+    /**
+     * 
+     * @return True if primitive wasn't really removed from the dataset, it only become incomplete again
+     */
+    public boolean wasComplete() {
+        return wasComplete;
+    }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2622)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2623)
@@ -52,5 +52,4 @@
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
 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;
@@ -66,5 +65,5 @@
  * objects are visible on the map and can be selected there. Relations are not.
  */
-public class RelationListDialog extends ToggleDialog implements MapView.LayerChangeListener, DataSetListener, DataChangeListener {
+public class RelationListDialog extends ToggleDialog implements DataSetListener {
     //private static final Logger logger = Logger.getLogger(RelationListDialog.class.getName());
 
@@ -143,12 +142,10 @@
 
     @Override public void showNotify() {
-        MapView.addLayerChangeListener(this);
         MapView.addLayerChangeListener(newAction);
         DatasetEventManager.getInstance().addDatasetListener(this, true);
-        dataChanged(Main.main.getEditLayer());
+        dataChanged(null);
     }
 
     @Override public void hideNotify() {
-        MapView.removeLayerChangeListener(this);
         MapView.removeLayerChangeListener(newAction);
         DatasetEventManager.getInstance().removeDatasetListener(this);
@@ -521,4 +518,21 @@
         }
 
+        public synchronized void sort() {
+            Collections.sort(
+                    relations,
+                    new Comparator<Relation>() {
+                        NameFormatter formatter = DefaultNameFormatter.getInstance();
+
+                        public int compare(Relation r1, Relation r2) {
+                            return r1.getDisplayName(formatter).compareTo(r2.getDisplayName(formatter));
+                        }
+                    }
+            );
+        }
+
+        private boolean isValid(Relation r) {
+            return !r.isDeleted() && r.isVisible() && !r.isIncomplete();
+        }
+
         public synchronized void setRelations(Collection<Relation> relations) {
             List<Relation> sel =  getSelectedRelations();
@@ -531,5 +545,5 @@
             }
             for (Relation r: relations) {
-                if (! r.isDeleted() && r.isVisible() && !r.isIncomplete()) {
+                if (isValid(r)) {
                     this.relations.add(r);
                 }
@@ -538,17 +552,4 @@
             fireIntervalAdded(this, 0, getSize());
             setSelectedRelations(sel);
-        }
-
-        public synchronized void sort() {
-            Collections.sort(
-                    relations,
-                    new Comparator<Relation>() {
-                        NameFormatter formatter = DefaultNameFormatter.getInstance();
-
-                        public int compare(Relation r1, Relation r2) {
-                            return r1.getDisplayName(formatter).compareTo(r2.getDisplayName(formatter));
-                        }
-                    }
-            );
         }
 
@@ -561,5 +562,4 @@
          */
         public synchronized void addRelations(Collection<? extends OsmPrimitive> addedPrimitives) {
-            if (addedPrimitives == null || addedPrimitives.isEmpty()) return;
             boolean added = false;
             for (OsmPrimitive p: addedPrimitives) {
@@ -567,9 +567,13 @@
                     continue;
                 }
-                if (relations.contains(p)) {
+
+                Relation r = (Relation)p;
+                if (relations.contains(r)) {
                     continue;
                 }
-                relations.add((Relation)p);
-                added = true;
+                if (isValid(r)) {
+                    relations.add(r);
+                    added = true;
+                }
             }
             if (added) {
@@ -695,19 +699,4 @@
 
     /* ---------------------------------------------------------------------------------- */
-    /* LayerChangeListener                                                                */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer a, Layer b) {
-        if (a != null && a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).listenerDataChanged.remove(this);
-        }
-        if (b != null && b instanceof OsmDataLayer) {
-            ((OsmDataLayer)b).listenerDataChanged.add(this);
-        }
-
-    }
-    public void layerRemoved(Layer a) {/* irrelevant in this context */}
-    public void layerAdded(Layer a) {/* irrelevant in this context */}
-
-    /* ---------------------------------------------------------------------------------- */
     /* DataSetListener                                                                    */
     /* ---------------------------------------------------------------------------------- */
@@ -751,12 +740,3 @@
         }
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* DataSetListener                                                                    */
-    /* ---------------------------------------------------------------------------------- */
-    public void dataChanged(OsmDataLayer l) {
-        if (l != null && l == Main.main.getEditLayer()) {
-            initFromLayer(l);
-        }
-    }
 }
