Index: trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 5549)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 5550)
@@ -42,5 +42,5 @@
      */
     public CrossingWays() {
-        super(tr("Crossing ways"),
+        super(tr("Crossing ways."),
                 tr("This test checks if two roads, railways, waterways or buildings crosses in the same layer, but are not connected by a node."));
     }
@@ -139,4 +139,6 @@
                         if (isBuilding) {
                             message = tr("Crossing buildings");
+                        } else if ((es1.waterway != null && es2.waterway != null)) {
+                            message = tr("Crossing waterways");
                         } else if ((es1.waterway != null && es2.ws.way.get("highway") != null)
                                 || (es2.waterway != null && es1.ws.way.get("highway") != null)) {
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java	(revision 5549)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java	(revision 5550)
@@ -3,4 +3,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -49,6 +50,37 @@
                     });
             if (!overlaps.isEmpty()) {
-                errors.add(new TestError(this, Severity.OTHER, tr("Overlapping Areas"),
-                        OVERLAPPING_AREAS, Collections.singletonList(w), overlaps));
+                Collection<Way> overlapsWater = new ArrayList<Way>();
+                Collection<Way> overlapsOther = new ArrayList<Way>();
+
+                String natural1 = w.get("natural");
+                String landuse1 = w.get("landuse");
+                boolean isWaterArea = "water".equals(natural1) || "wetland".equals(natural1) || "coastline".equals(natural1) || "reservoir".equals(landuse1);
+                boolean isWaterArea2 = false;
+
+                for (Way wayOther : overlaps) {
+                    String natural2 = wayOther.get("natural");
+                    String landuse2 = wayOther.get("landuse");
+                    boolean isWaterAreaTest = "water".equals(natural2) || "wetland".equals(natural2) || "coastline".equals(natural2) || "reservoir".equals(landuse2);
+
+                    if (!isWaterArea2) {
+                        isWaterArea2 = isWaterAreaTest;
+                    }
+
+                    if (isWaterArea && isWaterAreaTest) {
+                        overlapsWater.add(wayOther);
+                    } else {
+                        overlapsOther.add(wayOther);
+                    }
+                }
+
+                if (!overlapsWater.isEmpty()) {
+                    errors.add(new TestError(this, Severity.WARNING, tr("Overlapping Water Areas"),
+                            OVERLAPPING_AREAS, Collections.singletonList(w), overlapsWater));
+                }
+
+                if (!overlapsOther.isEmpty()) {
+                    errors.add(new TestError(this, Severity.OTHER, tr("Overlapping Areas"),
+                            OVERLAPPING_AREAS, Collections.singletonList(w), overlapsOther));
+                }
             }
         }
