Index: trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 4447)
+++ trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 4448)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.data.validation.tests.NameMismatch;
 import org.openstreetmap.josm.data.validation.tests.NodesWithSameName;
+import org.openstreetmap.josm.data.validation.tests.OverlappingAreas;
 import org.openstreetmap.josm.data.validation.tests.OverlappingWays;
 import org.openstreetmap.josm.data.validation.tests.RelationChecker;
@@ -100,4 +101,5 @@
         BuildingInBuilding.class, // ID 2001 .. 2099
         DeprecatedTags.class, // ID 2101 .. 2199
+        OverlappingAreas.class, // ID 2201 .. 2299
     };
 
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java	(revision 4448)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingAreas.java	(revision 4448)
@@ -0,0 +1,70 @@
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.QuadBuckets;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.gui.mappaint.AreaElemStyle;
+import org.openstreetmap.josm.gui.mappaint.ElemStyle;
+import org.openstreetmap.josm.gui.mappaint.ElemStyles;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.tools.Geometry;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
+
+public class OverlappingAreas extends Test {
+
+    protected static int OVERLAPPING_AREAS = 2201;
+    protected QuadBuckets<Way> index = new QuadBuckets<Way>();
+    private static ElemStyles styles = MapPaintStyles.getStyles();
+
+    public OverlappingAreas() {
+        super(tr("Overlapping Areas"));
+    }
+
+    @Override
+    public void visit(Way w) {
+        if (w.isUsable() && w.isClosed() && hasAreaElemStyle(w)) {
+            index.add(w);
+        }
+    }
+
+    @Override
+    public void endTest() {
+        for (final Way w : index) {
+            Collection<Way> overlaps = Utils.filter(
+                    index.search(w.getBBox()),
+                    new Predicate<Way>() {
+
+                        @Override
+                        public boolean evaluate(Way wi) {
+                            if (w.equals(wi)) {
+                                return false;
+                            } else {
+                                return Geometry.polygonIntersection(w.getNodes(), wi.getNodes())
+                                        == Geometry.PolygonIntersection.CROSSING;
+                            }
+                        }
+                    });
+            if (!overlaps.isEmpty()) {
+                errors.add(new TestError(this, Severity.OTHER, tr("Overlapping Areas"),
+                        OVERLAPPING_AREAS, Collections.singletonList(w), overlaps));
+            }
+        }
+    }
+
+    private boolean hasAreaElemStyle(OsmPrimitive p) {
+        for (ElemStyle s : styles.generateStyles(p, 1.0, null, false).a) {
+            if (s instanceof AreaElemStyle) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java	(revision 4447)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java	(revision 4448)
@@ -101,6 +101,5 @@
                     if (area > 0) {
                         if (ways == 0 || duplicated.size() == area) {
-                            errortype = tr("Overlapping areas");
-                            type = OVERLAPPING_AREA;
+                            continue;
                         } else if (highway == ways) {
                             errortype = tr("Overlapping highways (with area)");
@@ -127,5 +126,5 @@
                     errors.add(new TestError(this, 
                             type < OVERLAPPING_HIGHWAY_AREA ? Severity.WARNING : Severity.OTHER,
-                            tr(errortype), type, prims, duplicated));
+                            errortype, type, prims, duplicated));
                     ways_seen.put(current_ways, duplicated);
                 } else { /* way seen, mark highlight layer only */
