Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 13939)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 13940)
@@ -16,4 +16,5 @@
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.swing.AbstractAction;
@@ -207,5 +208,4 @@
      * Fix selected errors
      */
-    @SuppressWarnings("unchecked")
     private void fixErrors() {
         TreePath[] selectionPaths = tree.getSelectionPaths();
@@ -218,27 +218,11 @@
         for (TreePath path : selectionPaths) {
             DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
-            if (node == null) {
-                continue;
-            }
-
-            Enumeration<TreeNode> children = node.breadthFirstEnumeration();
-            while (children.hasMoreElements()) {
-                DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement();
-                if (processedNodes.contains(childNode)) {
-                    continue;
-                }
-
-                processedNodes.add(childNode);
-                Object nodeInfo = childNode.getUserObject();
-                if (nodeInfo instanceof TestError) {
-                    errorsToFix.add((TestError) nodeInfo);
-                }
+            if (node != null) {
+                ValidatorTreePanel.visitTestErrors(node, errorsToFix::add, processedNodes);
             }
         }
 
         // run fix task asynchronously
-        //
-        FixTask fixTask = new FixTask(errorsToFix);
-        MainApplication.worker.submit(fixTask);
+        MainApplication.worker.submit(new FixTask(errorsToFix));
     }
 
@@ -246,8 +230,7 @@
      * Set selected errors to ignore state
      */
-    @SuppressWarnings("unchecked")
     private void ignoreErrors() {
         int asked = JOptionPane.DEFAULT_OPTION;
-        boolean changed = false;
+        AtomicBoolean changed = new AtomicBoolean();
         TreePath[] selectionPaths = tree.getSelectionPaths();
         if (selectionPaths == null)
@@ -272,20 +255,9 @@
                 }
                 if (asked == JOptionPane.YES_NO_OPTION) {
-                    Enumeration<TreeNode> children = node.breadthFirstEnumeration();
-                    while (children.hasMoreElements()) {
-                        DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement();
-                        if (processedNodes.contains(childNode)) {
-                            continue;
-                        }
-
-                        processedNodes.add(childNode);
-                        Object nodeInfo = childNode.getUserObject();
-                        if (nodeInfo instanceof TestError) {
-                            TestError err = (TestError) nodeInfo;
-                            err.setIgnored(true);
-                            changed = true;
-                            state.add(node.getDepth() == 1 ? err.getIgnoreSubGroup() : err.getIgnoreGroup());
-                        }
-                    }
+                    ValidatorTreePanel.visitTestErrors(node, err -> {
+                        err.setIgnored(true);
+                        changed.set(true);
+                        state.add(node.getDepth() == 1 ? err.getIgnoreSubGroup() : err.getIgnoreGroup());
+                    }, processedNodes);
                     for (String s : state) {
                         OsmValidator.addIgnoredError(s);
@@ -297,25 +269,14 @@
             }
 
-            Enumeration<TreeNode> children = node.breadthFirstEnumeration();
-            while (children.hasMoreElements()) {
-                DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement();
-                if (processedNodes.contains(childNode)) {
-                    continue;
-                }
-
-                processedNodes.add(childNode);
-                Object nodeInfo = childNode.getUserObject();
-                if (nodeInfo instanceof TestError) {
-                    TestError error = (TestError) nodeInfo;
-                    String state = error.getIgnoreState();
-                    if (state != null) {
-                        OsmValidator.addIgnoredError(state);
-                    }
-                    changed = true;
-                    error.setIgnored(true);
-                }
-            }
-        }
-        if (changed) {
+            ValidatorTreePanel.visitTestErrors(node, error -> {
+                String state = error.getIgnoreState();
+                if (state != null) {
+                    OsmValidator.addIgnoredError(state);
+                }
+                changed.set(true);
+                error.setIgnored(true);
+            }, processedNodes);
+        }
+        if (changed.get()) {
             tree.resetErrors();
             OsmValidator.saveIgnoredErrors();
@@ -329,8 +290,7 @@
     @SuppressWarnings("unchecked")
     private void setSelectedItems() {
-        if (tree == null)
+        DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+        if (tree == null || ds == null)
             return;
-
-        Collection<OsmPrimitive> sel = new HashSet<>(40);
 
         TreePath[] selectedPaths = tree.getSelectionPaths();
@@ -338,4 +298,5 @@
             return;
 
+        Collection<OsmPrimitive> sel = new HashSet<>(40);
         for (TreePath path : selectedPaths) {
             DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
@@ -352,8 +313,5 @@
             }
         }
-        DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
-        if (ds != null) {
-            ds.setSelected(sel);
-        }
+        ds.setSelected(sel);
     }
 
@@ -368,34 +326,18 @@
      * @return whether the selected elements has any fix
      */
-    @SuppressWarnings("unchecked")
     private boolean setSelection(Collection<OsmPrimitive> sel, boolean addSelected) {
-        boolean hasFixes = false;
+        AtomicBoolean hasFixes = new AtomicBoolean();
 
         DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
         if (lastSelectedNode != null && !lastSelectedNode.equals(node)) {
-            Enumeration<TreeNode> children = lastSelectedNode.breadthFirstEnumeration();
-            while (children.hasMoreElements()) {
-                DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement();
-                Object nodeInfo = childNode.getUserObject();
-                if (nodeInfo instanceof TestError) {
-                    TestError error = (TestError) nodeInfo;
-                    error.setSelected(false);
-                }
-            }
+            ValidatorTreePanel.visitTestErrors(lastSelectedNode, error -> error.setSelected(false));
         }
 
         lastSelectedNode = node;
-        if (node == null)
-            return hasFixes;
-
-        Enumeration<TreeNode> children = node.breadthFirstEnumeration();
-        while (children.hasMoreElements()) {
-            DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement();
-            Object nodeInfo = childNode.getUserObject();
-            if (nodeInfo instanceof TestError) {
-                TestError error = (TestError) nodeInfo;
+        if (node != null) {
+            ValidatorTreePanel.visitTestErrors(node, error -> {
                 error.setSelected(true);
 
-                hasFixes = hasFixes || error.isFixable();
+                hasFixes.set(hasFixes.get() || error.isFixable());
                 if (addSelected) {
                     error.getPrimitives().stream()
@@ -403,12 +345,12 @@
                             .forEach(sel::add);
                 }
-            }
-        }
-        selectButton.setEnabled(true);
-        if (ignoreButton != null) {
-            ignoreButton.setEnabled(true);
-        }
-
-        return hasFixes;
+            });
+            selectButton.setEnabled(true);
+            if (ignoreButton != null) {
+                ignoreButton.setEnabled(true);
+            }
+        }
+
+        return hasFixes.get();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 13939)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 13940)
@@ -14,4 +14,5 @@
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 
@@ -388,14 +389,6 @@
      * Expands complete tree
      */
-    @SuppressWarnings("unchecked")
     public void expandAll() {
-        DefaultMutableTreeNode root = getRoot();
-
-        int row = 0;
-        Enumeration<TreeNode> children = root.breadthFirstEnumeration();
-        while (children.hasMoreElements()) {
-            children.nextElement();
-            expandRow(row++);
-        }
+        visitTreeNodes(getRoot(), x -> expandPath(new TreePath(x.getPath())));
     }
 
@@ -423,4 +416,50 @@
     }
 
+    /**
+     * Visitor call for all tree nodes children of root, in breadth-first order.
+     * @param root Root node
+     * @param visitor Visitor
+     * @since 13940
+     */
+    public static void visitTreeNodes(DefaultMutableTreeNode root, Consumer<DefaultMutableTreeNode> visitor) {
+        @SuppressWarnings("unchecked")
+        Enumeration<TreeNode> errorMessages = root.breadthFirstEnumeration();
+        while (errorMessages.hasMoreElements()) {
+            visitor.accept(((DefaultMutableTreeNode) errorMessages.nextElement()));
+        }
+    }
+
+    /**
+     * Visitor call for all {@link TestError} nodes children of root, in breadth-first order.
+     * @param root Root node
+     * @param visitor Visitor
+     * @since 13940
+     */
+    public static void visitTestErrors(DefaultMutableTreeNode root, Consumer<TestError> visitor) {
+        visitTestErrors(root, visitor, null);
+    }
+
+    /**
+     * Visitor call for all {@link TestError} nodes children of root, in breadth-first order.
+     * @param root Root node
+     * @param visitor Visitor
+     * @param processedNodes Set of already visited nodes (optional)
+     * @since 13940
+     */
+    public static void visitTestErrors(DefaultMutableTreeNode root, Consumer<TestError> visitor,
+            Set<DefaultMutableTreeNode> processedNodes) {
+        visitTreeNodes(root, n -> {
+            if (processedNodes == null || !processedNodes.contains(n)) {
+                if (processedNodes != null) {
+                    processedNodes.add(n);
+                }
+                Object o = n.getUserObject();
+                if (o instanceof TestError) {
+                    visitor.accept((TestError) o);
+                }
+            }
+        });
+    }
+
     @Override public void primitivesRemoved(PrimitivesRemovedEvent event) {
         // Remove purged primitives (fix #8639)
Index: trunk/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java	(revision 13939)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java	(revision 13940)
@@ -7,5 +7,4 @@
 import java.io.File;
 import java.util.Collections;
-import java.util.Enumeration;
 import java.util.List;
 
@@ -13,5 +12,4 @@
 import javax.swing.Icon;
 import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreeNode;
 
 import org.openstreetmap.josm.actions.RenameLayerAction;
@@ -26,4 +24,5 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
+import org.openstreetmap.josm.gui.dialogs.validator.ValidatorTreePanel;
 import org.openstreetmap.josm.gui.io.importexport.ValidatorErrorExporter;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
@@ -68,5 +67,4 @@
      * Draw nodes last to overlap the ways they belong to.
      */
-    @SuppressWarnings("unchecked")
     @Override
     public void paint(final Graphics2D g, final MapView mv, Bounds bounds) {
@@ -79,11 +77,5 @@
         DefaultMutableTreeNode severity = (DefaultMutableTreeNode) root.getLastChild();
         while (severity != null) {
-            Enumeration<TreeNode> errorMessages = severity.breadthFirstEnumeration();
-            while (errorMessages.hasMoreElements()) {
-                Object tn = ((DefaultMutableTreeNode) errorMessages.nextElement()).getUserObject();
-                if (tn instanceof TestError) {
-                    paintVisitor.visit((TestError) tn);
-                }
-            }
+            ValidatorTreePanel.visitTestErrors(severity, paintVisitor::visit);
 
             // Severities in inverse order
