Index: src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/TestError.java	(revision 11227)
+++ src/org/openstreetmap/josm/data/validation/TestError.java	(working copy)
@@ -11,7 +11,6 @@
 import java.util.TreeSet;
 import java.util.function.Supplier;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -18,15 +17,6 @@
 import org.openstreetmap.josm.data.osm.Relation;
 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;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -36,7 +26,7 @@
  * Validation error
  * @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;
     /** Severity */
@@ -583,47 +573,6 @@
         return AlphanumComparator.getInstance().compare(v1.toString(), 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(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() {
         return "TestError [tester=" + tester + ", code=" + code + ", message=" + message + ']';
Index: src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 11227)
+++ src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(working copy)
@@ -29,6 +29,15 @@
 import org.openstreetmap.josm.Main;
 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;
 import org.openstreetmap.josm.data.validation.util.MultipleNameVisitor;
@@ -45,7 +54,7 @@
  *
  * @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,6 +104,10 @@
                 removeKeyListener(keyListener);
             }
         }
+        DataSet ds = Main.getLayerManager().getEditDataSet();
+        if (ds != null) {
+            ds.addDataSetListener(this);
+        }
     }
 
     @Override
@@ -302,13 +315,9 @@
         if (errors == null)
             return;
         clearErrors();
-        DataSet ds = Main.getLayerManager().getEditDataSet();
         for (TestError error : newerrors) {
             if (!error.isIgnored()) {
                 errors.add(error);
-                if (ds != null) {
-                    ds.addDataSetListener(error);
-                }
             }
         }
         if (isVisible()) {
@@ -413,12 +422,6 @@
 
     private void clearErrors() {
         if (errors != null) {
-            DataSet ds = Main.getLayerManager().getEditDataSet();
-            if (ds != null) {
-                for (TestError e : errors) {
-                    ds.removeDataSetListener(e);
-                }
-            }
             errors.clear();
         }
     }
@@ -425,6 +428,53 @@
 
     @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
+    }
 }
