Index: /trunk/src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 11234)
+++ /trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 11235)
@@ -12,5 +12,4 @@
 import java.util.function.Supplier;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
@@ -19,13 +18,4 @@
 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;
 import org.openstreetmap.josm.tools.AlphanumComparator;
@@ -37,5 +27,5 @@
  * @since 3669
  */
-public class TestError implements Comparable<TestError>, DataSetListener {
+public class TestError implements Comparable<TestError> {
     /** is this error on the ignore list */
     private boolean ignored;
@@ -584,45 +574,4 @@
     }
 
-    @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(e, "Unable to remove primitives from "+this+'.');
-            }
-        }
-    }
-
-    @Override public void primitivesAdded(PrimitivesAddedEvent event) {
-        // Do nothing
-    }
-
-    @Override public void tagsChanged(TagsChangedEvent event) {
-        // Do nothing
-    }
-
-    @Override public void nodeMoved(NodeMovedEvent event) {
-        // Do nothing
-    }
-
-    @Override public void wayNodesChanged(WayNodesChangedEvent event) {
-        // Do nothing
-    }
-
-    @Override public void relationMembersChanged(RelationMembersChangedEvent event) {
-        // Do nothing
-    }
-
-    @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {
-        // Do nothing
-    }
-
-    @Override public void dataChanged(DataChangedEvent event) {
-        // Do nothing
-    }
-
     @Override
     public String toString() {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 11234)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 11235)
@@ -30,4 +30,13 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+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.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
@@ -46,5 +55,5 @@
  * @author frsantos
  */
-public class ValidatorTreePanel extends JTree implements Destroyable {
+public class ValidatorTreePanel extends JTree implements Destroyable, DataSetListener {
 
     private static final class GroupTreeNode extends DefaultMutableTreeNode {
@@ -95,4 +104,8 @@
                 removeKeyListener(keyListener);
             }
+        }
+        DataSet ds = Main.getLayerManager().getEditDataSet();
+        if (ds != null) {
+            ds.addDataSetListener(this);
         }
     }
@@ -303,11 +316,7 @@
             return;
         clearErrors();
-        DataSet ds = Main.getLayerManager().getEditDataSet();
         for (TestError error : newerrors) {
             if (!error.isIgnored()) {
                 errors.add(error);
-                if (ds != null) {
-                    ds.addDataSetListener(error);
-                }
             }
         }
@@ -414,10 +423,4 @@
     private void clearErrors() {
         if (errors != null) {
-            DataSet ds = Main.getLayerManager().getEditDataSet();
-            if (ds != null) {
-                for (TestError e : errors) {
-                    ds.removeDataSetListener(e);
-                }
-            }
             errors.clear();
         }
@@ -426,5 +429,52 @@
     @Override
     public void destroy() {
+        DataSet ds = Main.getLayerManager().getEditDataSet();
+        if (ds != null) {
+            ds.removeDataSetListener(this);
+        }
         clearErrors();
     }
+
+    @Override public void primitivesRemoved(PrimitivesRemovedEvent event) {
+        // Remove purged primitives (fix #8639)
+        for (TestError err : errors) {
+            try {
+                err.getPrimitives().removeAll(event.getPrimitives());
+            } catch (UnsupportedOperationException e) {
+                if (event.getPrimitives().containsAll(err.getPrimitives())) {
+                    err.getPrimitives().clear();
+                } else {
+                    Main.warn(e, "Unable to remove primitives from "+err+'.');
+                }
+            }
+        }
+    }
+
+    @Override public void primitivesAdded(PrimitivesAddedEvent event) {
+        // Do nothing
+    }
+
+    @Override public void tagsChanged(TagsChangedEvent event) {
+        // Do nothing
+    }
+
+    @Override public void nodeMoved(NodeMovedEvent event) {
+        // Do nothing
+    }
+
+    @Override public void wayNodesChanged(WayNodesChangedEvent event) {
+        // Do nothing
+    }
+
+    @Override public void relationMembersChanged(RelationMembersChangedEvent event) {
+        // Do nothing
+    }
+
+    @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {
+        // Do nothing
+    }
+
+    @Override public void dataChanged(DataChangedEvent event) {
+        // Do nothing
+    }
 }
