Index: trunk/src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 5910)
+++ trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 5911)
@@ -8,4 +8,5 @@
 import java.util.TreeSet;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
@@ -14,4 +15,13 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
+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;
 import org.openstreetmap.josm.data.validation.util.MultipleNameVisitor;
 
@@ -20,5 +30,5 @@
  * @author frsantos
  */
-public class TestError implements Comparable<TestError> {
+public class TestError implements Comparable<TestError>, DataSetListener {
     /** is this error on the ignore list */
     private Boolean ignored = false;
@@ -290,3 +300,29 @@
         return v1.toString().compareToIgnoreCase(v2.toString());
     }
+
+    @Override public void primitivesRemoved(PrimitivesRemovedEvent event) {
+        // Remove purged primitives (fix #8639)
+        try {
+            primitives.removeAll(event.getPrimitives());
+        } catch (UnsupportedOperationException e) {
+            if (event.getPrimitives().containsAll(primitives)) {
+                primitives = Collections.emptyList();
+            } else {
+                Main.warn("Unable to remove primitives from "+this);
+            }
+        }
+    }
+
+    @Override public void primitivesAdded(PrimitivesAddedEvent event) {}
+    @Override public void tagsChanged(TagsChangedEvent event) {}
+    @Override public void nodeMoved(NodeMovedEvent event) {}
+    @Override public void wayNodesChanged(WayNodesChangedEvent event) {}
+    @Override public void relationMembersChanged(RelationMembersChangedEvent event) {}
+    @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {}
+    @Override public void dataChanged(DataChangedEvent event) {}
+
+    @Override
+    public String toString() {
+        return "TestError [tester=" + tester + ", code=" + code + "]";
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/validation/util/MultipleNameVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/util/MultipleNameVisitor.java	(revision 5910)
+++ trunk/src/org/openstreetmap/josm/data/validation/util/MultipleNameVisitor.java	(revision 5911)
@@ -60,5 +60,5 @@
         }
 
-        if (size == 1) {
+        if (size <= 1) {
             displayName = name;
         } else {
@@ -92,5 +92,5 @@
      */
     public Icon getIcon() {
-        if (size == 1)
+        if (size <= 1)
             return icon;
         else
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 5910)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 5911)
@@ -22,4 +22,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.Severity;
@@ -27,4 +28,5 @@
 import org.openstreetmap.josm.data.validation.util.MultipleNameVisitor;
 import org.openstreetmap.josm.gui.preferences.ValidatorPreference;
+import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.MultiMap;
 
@@ -36,5 +38,5 @@
  * @author frsantos
  */
-public class ValidatorTreePanel extends JTree {
+public class ValidatorTreePanel extends JTree implements Destroyable {
     /** Serializable ID */
     private static final long serialVersionUID = 2952292777351992696L;
@@ -294,8 +296,12 @@
         if (errors == null)
             return;
-        errors.clear();
+        clearErrors();
+        DataSet ds = Main.main.getCurrentDataSet();
         for (TestError error : newerrors) {
             if (!error.getIgnored()) {
                 errors.add(error);
+                if (ds != null) {
+                    ds.addDataSetListener(error);
+                }
             }
         }
@@ -374,3 +380,20 @@
         return updateCount;
     }
+    
+    private void clearErrors() {
+        if (errors != null) {
+            DataSet ds = Main.main.getCurrentDataSet();
+            if (ds != null) {
+                for (TestError e : errors) {
+                    ds.removeDataSetListener(e);
+                }
+            }
+            errors.clear();
+        }
+    }
+
+    @Override
+    public void destroy() {
+        clearErrors();
+    }
 }
