Index: trunk/src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 14767)
+++ trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 14768)
@@ -429,10 +429,14 @@
         if (equals(o)) return 0;
 
-        MultipleNameVisitor v1 = new MultipleNameVisitor();
-        MultipleNameVisitor v2 = new MultipleNameVisitor();
-
-        v1.visit(getPrimitives());
-        v2.visit(o.getPrimitives());
-        return AlphanumComparator.getInstance().compare(v1.toString(), v2.toString());
+        return AlphanumComparator.getInstance().compare(getNameVisitor().toString(), o.getNameVisitor().toString());
+    }
+
+    /**
+     * @return Name visitor (used in cell renderer and for sorting)
+     */
+    public MultipleNameVisitor getNameVisitor() {
+        MultipleNameVisitor v = new MultipleNameVisitor();
+        v.visit(getPrimitives());
+        return v;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 14767)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java	(revision 14768)
@@ -40,8 +40,9 @@
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.data.validation.util.MultipleNameVisitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ListenerList;
+import org.openstreetmap.josm.tools.Pair;
 
 /**
@@ -115,7 +116,5 @@
             if (nodeInfo instanceof TestError) {
                 TestError error = (TestError) nodeInfo;
-                MultipleNameVisitor v = new MultipleNameVisitor();
-                v.visit(error.getPrimitives());
-                res = "<html>" + v.getText() + "<br>" + error.getMessage();
+                res = "<html>" + error.getNameVisitor().getText() + "<br>" + error.getMessage();
                 String d = error.getDescription();
                 if (d != null)
@@ -156,5 +155,5 @@
         }
         // Sort validation errors - #8517
-        Collections.sort(errors);
+        sortErrors(errors);
 
         // Remember the currently expanded rows
@@ -270,4 +269,25 @@
 
     /**
+     * Sort list or errors in place.
+     * @param errors error list to be sorted
+     */
+    static void sortErrors(List<TestError> errors) {
+        // Calculate the string to sort only once for each element
+        // Avoids to call TestError.compare() which costly
+        List<Pair<String, TestError>> toSort = new ArrayList<>();
+        for (int i = 0; i < errors.size(); i++) {
+            TestError e = errors.get(i);
+            toSort.add(new Pair<>(e.getNameVisitor().getText(), e));
+        }
+        toSort.sort((o1,o2) -> AlphanumComparator.getInstance().compare(o1.a, o2.a));
+        List<TestError> sortedErrors = new ArrayList<>(errors.size());
+        for (Pair<String, TestError> p : toSort) {
+            sortedErrors.add(p.b);
+        }
+        errors.clear();
+        errors.addAll(sortedErrors);
+    }
+
+    /**
      * Add a new invalidation listener
      * @param listener The listener
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreeRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreeRenderer.java	(revision 14767)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreeRenderer.java	(revision 14768)
@@ -33,6 +33,5 @@
         } else if (nodeInfo instanceof TestError) {
             TestError error = (TestError) nodeInfo;
-            MultipleNameVisitor v = new MultipleNameVisitor();
-            v.visit(error.getPrimitives());
+            MultipleNameVisitor v = error.getNameVisitor();
             setText(v.getText());
             setIcon(v.getIcon());
