Index: org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 14430)
+++ org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -37,6 +37,17 @@
     static final String WATERWAY = "waterway";
     static final String LANDUSE = "landuse";
 
+    private final class MessageHelper {
+        final String message;
+        final int code;
+
+        MessageHelper(String message, int code) {
+            super();
+            this.message = message;
+            this.code = code;
+        }
+    }
+
     /**
      * Type of way. Entries have to be declared in alphabetical order, see sort below.
      */
@@ -64,7 +75,7 @@
     /** The already detected ways in error */
     private final Map<List<Way>, List<WaySegment>> seenWays = new HashMap<>(50);
 
-    private final int code;
+    protected final int code;
 
     /**
      * General crossing ways test.
@@ -119,7 +130,7 @@
         }
 
         @Override
-        String createMessage(Way w1, Way w2) {
+        MessageHelper createMessage(Way w1, Way w2) {
             WayType[] types = {WayType.of(w1), WayType.of(w2)};
             Arrays.sort(types);
 
@@ -126,18 +137,18 @@
             if (types[0] == types[1]) {
                 switch(types[0]) {
                     case BUILDING:
-                        return tr("Crossing buildings");
+                        return new MessageHelper(tr("Crossing buildings"), 610);
                     case HIGHWAY:
-                        return tr("Crossing highways");
+                        return new MessageHelper(tr("Crossing highways"), 620);
                     case RAILWAY:
-                        return tr("Crossing railways");
+                        return new MessageHelper(tr("Crossing railways"), 630);
                     case RESIDENTIAL_AREA:
-                        return tr("Crossing residential areas");
+                        return new MessageHelper(tr("Crossing residential areas"), 640);
                     case WATERWAY:
-                        return tr("Crossing waterways");
+                        return new MessageHelper(tr("Crossing waterways"), 650);
                     case WAY:
                     default:
-                        return tr("Crossing ways");
+                        return new MessageHelper(tr("Crossing ways"), CROSSING_WAYS);
                 }
             } else {
                 switch (types[0]) {
@@ -144,44 +155,44 @@
                     case BUILDING:
                         switch (types[1]) {
                             case HIGHWAY:
-                                return tr("Crossing building/highway");
+                                return new MessageHelper(tr("Crossing building/highway"), 612);
                             case RAILWAY:
-                                return tr("Crossing building/railway");
+                                return new MessageHelper(tr("Crossing building/railway"), 613);
                             case RESIDENTIAL_AREA:
-                                return tr("Crossing building/residential area");
+                                return new MessageHelper(tr("Crossing building/residential area"), 614);
                             case WATERWAY:
-                                return tr("Crossing building/waterway");
+                                return new MessageHelper(tr("Crossing building/waterway"), 615);
                             case WAY:
                             default:
-                                return tr("Crossing building/way");
+                                return new MessageHelper(tr("Crossing building/way"), 611);
                         }
                     case HIGHWAY:
                         switch (types[1]) {
                             case RAILWAY:
-                                return tr("Crossing highway/railway");
+                                return new MessageHelper(tr("Crossing highway/railway"), 622);
                             case WATERWAY:
-                                return tr("Crossing highway/waterway");
+                                return new MessageHelper(tr("Crossing highway/waterway"), 623);
                             case WAY:
                             default:
-                                return tr("Crossing highway/way");
+                                return new MessageHelper(tr("Crossing highway/way"), 621);
                         }
                     case RAILWAY:
                         switch (types[1]) {
                             case WATERWAY:
-                                return tr("Crossing railway/waterway");
+                                return new MessageHelper(tr("Crossing railway/waterway"), 632);
                             case WAY:
                             default:
-                                return tr("Crossing railway/way");
+                                return new MessageHelper(tr("Crossing railway/way"), 631);
                         }
                     case RESIDENTIAL_AREA:
                         switch (types[1]) {
                             case WAY:
                             default:
-                                return tr("Crossing residential area/way");
+                                return new MessageHelper(tr("Crossing residential area/way"), 641);
                         }
                     case WATERWAY:
                     default:
-                        return tr("Crossing waterway/way");
+                        return new MessageHelper(tr("Crossing waterway/way"), 651);
                 }
             }
         }
@@ -213,8 +224,8 @@
         }
 
         @Override
-        String createMessage(Way w1, Way w2) {
-            return tr("Crossing boundaries");
+        MessageHelper createMessage(Way w1, Way w2) {
+            return new MessageHelper(tr("Crossing boundaries"), CROSSING_BOUNDARIES);
         }
 
         @Override
@@ -250,8 +261,8 @@
         }
 
         @Override
-        String createMessage(Way w1, Way w2) {
-            return tr("Crossing barriers");
+        MessageHelper createMessage(Way w1, Way w2) {
+            return new MessageHelper(tr("Crossing barriers"), CROSSING_BARRIERS);
         }
     }
 
@@ -285,8 +296,8 @@
         }
 
         @Override
-        String createMessage(Way w1, Way w2) {
-            return tr("Self-crossing ways");
+        MessageHelper createMessage(Way w1, Way w2) {
+            return new MessageHelper(tr("Self-crossing ways"), CROSSING_SELF);
         }
     }
 
@@ -338,7 +349,7 @@
 
     abstract boolean ignoreWaySegmentCombination(Way w1, Way w2);
 
-    abstract String createMessage(Way w1, Way w2);
+    abstract MessageHelper createMessage(Way w1, Way w2);
 
     @Override
     public void visit(Way w) {
@@ -354,7 +365,7 @@
             final EastNorth en1 = es1.getFirstNode().getEastNorth();
             final EastNorth en2 = es1.getSecondNode().getEastNorth();
             if (en1 == null || en2 == null) {
-                Logging.warn("Crossing ways test skipped "+es1);
+                Logging.warn("Crossing ways test skipped " + es1);
                 continue;
             }
             for (List<WaySegment> segments : getSegments(cellSegments, en1, en2)) {
@@ -375,9 +386,9 @@
                         highlight.add(es1);
                         highlight.add(es2);
 
-                        final String message = createMessage(es1.way, es2.way);
-                        errors.add(TestError.builder(this, Severity.WARNING, code)
-                                .message(message)
+                        final MessageHelper message = createMessage(es1.way, es2.way);
+                        errors.add(TestError.builder(this, Severity.WARNING, message.code)
+                                .message(message.message)
                                 .primitives(prims)
                                 .highlightWaySegments(highlight)
                                 .build());
Index: org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 14430)
+++ org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(working copy)
@@ -45,17 +45,19 @@
  * @author frsantos
  */
 public abstract class UnconnectedWays extends Test {
+    private final int code;
 
     /**
      * Unconnected highways test.
      */
     public static class UnconnectedHighways extends UnconnectedWays {
+        static final int UNCONNECTED_HIGHWAYS = 1311;
 
         /**
          * Constructs a new {@code UnconnectedHighways} test.
          */
         public UnconnectedHighways() {
-            super(tr("Unconnected highways"));
+            super(tr("Unconnected highways"), UNCONNECTED_HIGHWAYS);
         }
 
         @Override
@@ -68,12 +70,12 @@
      * Unconnected railways test.
      */
     public static class UnconnectedRailways extends UnconnectedWays {
-
+        static final int UNCONNECTED_RAILWAYS = 1321;
         /**
          * Constructs a new {@code UnconnectedRailways} test.
          */
         public UnconnectedRailways() {
-            super(tr("Unconnected railways"));
+            super(tr("Unconnected railways"), UNCONNECTED_RAILWAYS);
         }
 
         @Override
@@ -86,12 +88,12 @@
      * Unconnected waterways test.
      */
     public static class UnconnectedWaterways extends UnconnectedWays {
-
+        static final int UNCONNECTED_WATERWAYS = 1331;
         /**
          * Constructs a new {@code UnconnectedWaterways} test.
          */
         public UnconnectedWaterways() {
-            super(tr("Unconnected waterways"));
+            super(tr("Unconnected waterways"), UNCONNECTED_WATERWAYS);
         }
 
         @Override
@@ -104,12 +106,12 @@
      * Unconnected natural/landuse test.
      */
     public static class UnconnectedNaturalOrLanduse extends UnconnectedWays {
-
+        static final int UNCONNECTED_NATURAL_OR_LANDUSE = 1341;
         /**
          * Constructs a new {@code UnconnectedNaturalOrLanduse} test.
          */
         public UnconnectedNaturalOrLanduse() {
-            super(tr("Unconnected natural lands and landuses"));
+            super(tr("Unconnected natural lands and landuses"), UNCONNECTED_NATURAL_OR_LANDUSE);
         }
 
         @Override
@@ -122,12 +124,12 @@
      * Unconnected power ways test.
      */
     public static class UnconnectedPower extends UnconnectedWays {
-
+        static final int UNCONNECTED_POWER = 1351;
         /**
          * Constructs a new {@code UnconnectedPower} test.
          */
         public UnconnectedPower() {
-            super(tr("Unconnected power ways"));
+            super(tr("Unconnected power ways"), UNCONNECTED_POWER);
         }
 
         @Override
@@ -155,7 +157,19 @@
      * @since 6691
      */
     public UnconnectedWays(String title) {
+        this(title, UNCONNECTED_WAYS);
+
+    }
+
+    /**
+     * Constructs a new {@code UnconnectedWays} test with the given code.
+     * @param title The test title
+     * @param code The test code
+     * @since 14431
+     */
+    public UnconnectedWays(String title, int code) {
         super(title, tr("This test checks if a way has an endpoint very near to another way."));
+        this.code = code;
     }
 
     @Override
@@ -267,7 +281,7 @@
 
     protected final void addErrors(Severity severity, Map<Node, Way> errorMap, String message) {
         for (Map.Entry<Node, Way> error : errorMap.entrySet()) {
-            errors.add(TestError.builder(this, severity, UNCONNECTED_WAYS)
+            errors.add(TestError.builder(this, severity, code)
                     .message(message)
                     .primitives(error.getKey(), error.getValue())
                     .highlight(error.getKey())
