Index: trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 19451)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 19452)
@@ -134,6 +134,8 @@
                     || w1.hasTag(RAILWAY, "halt") != w2.hasTag(RAILWAY, "halt")))
                 return true;  // see #20089, #21541
-            return (w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && isWaterArea(w2))
-                    || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && isWaterArea(w1));
+            if (w1.hasTag(WATERWAY, "fairway") && w2.hasTag(WATERWAY, "fairway"))
+                return true; // see #24572
+            return (w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && isWaterAreaOrFairway(w2))
+                    || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && isWaterAreaOrFairway(w1));
         }
 
@@ -363,4 +365,8 @@
     }
 
+    static boolean isWaterAreaOrFairway(OsmPrimitive w) {
+        return isWaterArea(w) || w.hasTag(WATERWAY, "fairway");
+    }
+
     static boolean isHighway(OsmPrimitive w) {
         return w.hasTagDifferent(HIGHWAY, "rest_area", "services", "bus_stop", "platform");
