Index: src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 17912)
+++ src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -114,8 +114,6 @@
         boolean ignoreWaySegmentCombination(Way w1, Way w2) {
             if (w1 == w2)
                 return true;
-            if (areLayerOrLevelDifferent(w1, w2))
-                return true;
             if (isBuilding(w1) && isBuilding(w2))
                 return true; // handled by mapcss tests
             if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) || isWaterArea(w1))
@@ -378,13 +376,26 @@
                         highlight.add(es1);
                         highlight.add(es2);
 
-                        final MessageHelper message = createMessage(es1.getWay(), es2.getWay());
-                        errors.add(TestError.builder(this, Severity.WARNING, message.code)
-                                .message(message.message)
-                                .primitives(prims)
-                                .highlightWaySegments(highlight)
-                                .build());
-                        seenWays.put(prims, highlight);
+                        if (InvalidHighwayCrossingWaterwayTags(es1, es2))
+                        {
+                            errors.add(TestError.builder(this, Severity.WARNING, 652)
+                                    .message("Highway crossing waterway probably needs bridge=* or tunnel=* tag.")
+                                    .primitives(prims)
+                                    .highlightWaySegments(highlight)
+                                    .build());
+                        }
+
+                        if (!areLayerOrLevelDifferent(es1.getWay(), es2.getWay()))
+                        {
+                            final MessageHelper message = createMessage(es1.getWay(), es2.getWay());
+                            errors.add(TestError.builder(this, Severity.WARNING, message.code)
+                                    .message(message.message)
+                                    .primitives(prims)
+                                    .highlightWaySegments(highlight)
+                                    .build());
+                            seenWays.put(prims, highlight);
+
+                        }
                     } else {
                         highlight.add(es1);
                         highlight.add(es2);
@@ -395,6 +406,15 @@
         }
     }
 
+    private boolean InvalidHighwayCrossingWaterwayTags(WaySegment way1, WaySegment way2) {
+        return (way1.getWay().hasKey(HIGHWAY) && way1.getWay().hasKey("layer")
+                && !way1.getWay().hasKey("tunnel") && !way1.getWay().hasKey("bridge") && way2.getWay().hasKey(WATERWAY))
+                || (way2.getWay().hasKey(HIGHWAY) && way2.getWay().hasKey("layer")
+                && !way2.getWay().hasKey("tunnel") && !way2.getWay().hasKey("bridge") && way1.getWay().hasKey(WATERWAY));
+
+
+    }
+
     private static boolean areLayerOrLevelDifferent(Way w1, Way w2) {
         return !Objects.equals(OsmUtils.getLayer(w1), OsmUtils.getLayer(w2))
             || !Objects.equals(w1.get("level"), w2.get("level"));
