Index: src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java	(revision 4788)
+++ src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java	(working copy)
@@ -2,8 +2,10 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+
 import org.openstreetmap.josm.data.osm.QuadBuckets;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.validation.Severity;
@@ -39,17 +41,48 @@
 
                         @Override
                         public boolean evaluate(Way wi) {
-                            if (w.equals(wi)) {
+                            if (w.equals(wi))
                                 return false;
-                            } else {
+                            else
                                 return Geometry.polygonIntersection(w.getNodes(), wi.getNodes())
-                                        == Geometry.PolygonIntersection.CROSSING;
-                            }
+                                == Geometry.PolygonIntersection.CROSSING;
                         }
                     });
             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>( 8 );
+                Collection<Way> overlapsOther = new ArrayList<Way>( 8 );
+
+                System.out.println( "Overlapping areas for id:" + w.getId() );
+                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));
+                }
             }
         }
     }
Index: src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 4788)
+++ src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -42,7 +42,7 @@
      */
     public CrossingWays() {
         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."));
+                tr("This test checks if two roads, railways, waterways or buildings crosses in the same layer, but are not connected by a node."));
     }
 
     @Override
@@ -81,7 +81,10 @@
             return;
 
         String layer1 = w.get("layer");
-        if ("0".equals(layer1)) layer1 = null; //0 is default value
+        if ("0".equals(layer1))
+        {
+            layer1 = null; //0 is default value
+        }
 
         int nodesSize = w.getNodesCount();
         for (int i = 0; i < nodesSize - 1; i++) {
@@ -93,25 +96,39 @@
                     List<Way> prims;
                     List<WaySegment> highlight;
 
-                    if (errorSegments.contains(ws) && errorSegments.contains(es2.ws))
+                    if (errorSegments.contains(ws) && errorSegments.contains(es2.ws)) {
                         continue;
+                    }
 
                     String layer2 = es2.layer;
                     String railway2 = es2.railway;
                     boolean isCoastline2 = es2.coastline;
-                    if (layer1 == null ? layer2 != null : !layer1.equals(layer2))
+                    if (layer1 == null ? layer2 != null : !layer1.equals(layer2)) {
                         continue;
+                    }
 
-                    if (!es1.intersects(es2) ) continue;
-                    if (isSubway1 && "subway".equals(railway2)) continue;
-                    if (isTram1 && "tram".equals(railway2)) continue;
+                    if (!es1.intersects(es2) ) {
+                        continue;
+                    }
+                    if (isSubway1 && "subway".equals(railway2)) {
+                        continue;
+                    }
+                    if (isTram1 && "tram".equals(railway2)) {
+                        continue;
+                    }
 
-                    if (isCoastline1 != isCoastline2) continue;
+                    if (isCoastline1 != isCoastline2) {
+                        continue;
+                    }
                     if (("river".equals(waterway1) && "riverbank".equals(es2.waterway))
-                            || ("riverbank".equals(waterway1) && "river".equals(es2.waterway))) continue;
+                            || ("riverbank".equals(waterway1) && "river".equals(es2.waterway))) {
+                        continue;
+                    }
 
                     if ((es1.railway != null && es1.railway.equals("abandoned"))
-                            || (railway2 != null && railway2.equals("abandoned"))) continue;
+                            || (railway2 != null && railway2.equals("abandoned"))) {
+                        continue;
+                    }
 
                     prims = Arrays.asList(es1.ws.way, es2.ws.way);
                     if ((highlight = ways_seen.get(prims)) == null) {
@@ -122,6 +139,8 @@
                         String message;
                         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)) {
                             message = tr("Crossing waterway/highway");
@@ -130,10 +149,10 @@
                         }
 
                         errors.add(new TestError(this, Severity.WARNING,
-                            message,
-                            CROSSING_WAYS,
-                            prims,
-                            highlight));
+                                message,
+                                CROSSING_WAYS,
+                                prims,
+                                highlight));
                         ways_seen.put(prims, highlight);
                     } else {
                         highlight.add(es1.ws);
@@ -146,13 +165,13 @@
     }
 
     /**
-    * Returns all the cells this segment crosses.  Each cell contains the list
-    * of segments already processed
-    *
-    * @param n1 The first node
-    * @param n2 The second node
-    * @return A list with all the cells the segment crosses
-    */
+     * Returns all the cells this segment crosses.  Each cell contains the list
+     * of segments already processed
+     *
+     * @param n1 The first node
+     * @param n2 The second node
+     * @return A list with all the cells the segment crosses
+     */
     public List<List<ExtendedSegment>> getSegments(Node n1, Node n2) {
 
         List<List<ExtendedSegment>> cells = new ArrayList<List<ExtendedSegment>>();
@@ -217,10 +236,10 @@
                 return false;
 
             return Line2D.linesIntersect(
-                n1.getEastNorth().east(), n1.getEastNorth().north(),
-                n2.getEastNorth().east(), n2.getEastNorth().north(),
-                s2.n1.getEastNorth().east(), s2.n1.getEastNorth().north(),
-                s2.n2.getEastNorth().east(), s2.n2.getEastNorth().north());
+                    n1.getEastNorth().east(), n1.getEastNorth().north(),
+                    n2.getEastNorth().east(), n2.getEastNorth().north(),
+                    s2.n1.getEastNorth().east(), s2.n1.getEastNorth().north(),
+                    s2.n2.getEastNorth().east(), s2.n2.getEastNorth().north());
         }
     }
 }
