Index: trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 6514)
+++ trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 6515)
@@ -99,5 +99,9 @@
         UnclosedWays.class, // ID 1101 .. 1199
         TagChecker.class, // ID 1201 .. 1299
-        UnconnectedWays.class, // ID 1301 .. 1399
+        UnconnectedWays.UnconnectedHighways.class, // ID 1301 .. 1399
+        UnconnectedWays.UnconnectedRailways.class, // ID 1301 .. 1399
+        UnconnectedWays.UnconnectedWaterways.class, // ID 1301 .. 1399
+        UnconnectedWays.UnconnectedNaturalOrLanduse.class, // ID 1301 .. 1399
+        UnconnectedWays.UnconnectedPower.class, // ID 1301 .. 1399
         DuplicateWay.class, // ID 1401 .. 1499
         NameMismatch.class, // ID  1501 ..  1599
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 6514)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 6515)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.QuadBuckets;
@@ -32,9 +33,53 @@
 
 /**
- * Tests if there are segments that crosses in the same layer
+ * Tests if there are segments that crosses in the same layer.
+ * <br/>
+ * This class is abstract since highway/railway/waterway/… ways must be handled separately.
+ * An actual implementation must override {@link #isPrimitiveUsable(OsmPrimitive)}
+ * to denote which kind of primitives can be handled.
  *
  * @author frsantos
  */
-public class UnconnectedWays extends Test {
+public abstract class UnconnectedWays extends Test {
+
+    public static class UnconnectedHighways extends UnconnectedWays {
+
+        @Override
+        public boolean isPrimitiveUsable(OsmPrimitive p) {
+            return super.isPrimitiveUsable(p) && p.hasKey("highway");
+        }
+    }
+
+    public static class UnconnectedRailways extends UnconnectedWays {
+
+        @Override
+        public boolean isPrimitiveUsable(OsmPrimitive p) {
+            return super.isPrimitiveUsable(p) && p.hasKey("railway");
+        }
+    }
+
+    public static class UnconnectedWaterways extends UnconnectedWays {
+
+        @Override
+        public boolean isPrimitiveUsable(OsmPrimitive p) {
+            return super.isPrimitiveUsable(p) && p.hasKey("waterway");
+        }
+    }
+
+    public static class UnconnectedNaturalOrLanduse extends UnconnectedWays {
+
+        @Override
+        public boolean isPrimitiveUsable(OsmPrimitive p) {
+            return super.isPrimitiveUsable(p) && (p.hasKey("natural") || p.hasKey("landuse"));
+        }
+    }
+
+    public static class UnconnectedPower extends UnconnectedWays {
+
+        @Override
+        public boolean isPrimitiveUsable(OsmPrimitive p) {
+            return super.isPrimitiveUsable(p) && p.hasKey("power");
+        }
+    }
 
     protected static final int UNCONNECTED_WAYS = 1301;
@@ -343,8 +388,4 @@
     }
 
-    @Override
-    public void visit(Node n) {
-    }
-
     private void addNode(Node n, QuadBuckets<Node> s) {
         boolean m = middlenodes.contains(n);
