Index: trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 6490)
+++ trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 6491)
@@ -331,3 +331,9 @@
         this.north = Double.NaN;
     }
+
+    @Override
+    public boolean concernsArea() {
+        // A node cannot be an area
+        return false;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 6490)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 6491)
@@ -1312,3 +1312,26 @@
         return ret;
     }
+
+    /**
+     * Determines if this primitive has tags denoting an area.
+     * @return {@code true} if this primitive has tags denoting an area, {@code false} otherwise.
+     * @since 6491
+     */
+    public final boolean hasAreaTags() {
+        return hasKey("landuse")
+                || "yes".equals(get("area"))
+                || "riverbank".equals(get("waterway"))
+                || hasKey("natural")
+                || hasKey("amenity")
+                || hasKey("leisure")
+                || hasKey("building")
+                || hasKey("building:part");
+    }
+
+    /**
+     * Determines if this primitive semantically concerns an area.
+     * @return {@code true} if this primitive semantically concerns an area, according to its type, geometry and tags, {@code false} otherwise.
+     * @since 6491
+     */
+    public abstract boolean concernsArea();
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 6490)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 6491)
@@ -548,3 +548,8 @@
         }
     }
+
+    @Override
+    public boolean concernsArea() {
+        return isMultipolygon() && hasAreaTags();
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 6490)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 6491)
@@ -6,7 +6,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.HashSet;
 
 import org.openstreetmap.josm.Main;
@@ -721,3 +721,8 @@
         return !respectOneway || isOneway() != -1 ? lastNode() : firstNode();
     }
+
+    @Override
+    public boolean concernsArea() {
+        return hasAreaTags();
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java	(revision 6490)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java	(revision 6491)
@@ -55,17 +55,7 @@
     }
 
-    private boolean concernsArea(OsmPrimitive p) {
-        return p.get("landuse") != null
-                || "riverbank".equals(p.get("waterway"))
-                || p.get("natural") != null
-                || p.get("amenity") != null
-                || p.get("leisure") != null
-                || p.get("building") != null
-                || p.get("building:part") != null;
-    }
-    
     private boolean parentMultipolygonConcernsArea(OsmPrimitive p) {
         for (Relation r : OsmPrimitive.getFilteredList(p.getReferrers(), Relation.class)) {
-            if (r.isMultipolygon() && concernsArea(r) ) {
+            if (r.concernsArea() ) {
                 return true;
             }
@@ -73,5 +63,6 @@
         return false;
     }
-    
+
+    @SuppressWarnings("null")
     @Override
     public void endTest() {
@@ -99,5 +90,5 @@
                         area++;
                     }
-                    if (concernsArea(ws.way) || parentMultipolygonConcernsArea(ws.way)) {
+                    if (ws.way.concernsArea() || parentMultipolygonConcernsArea(ws.way)) {
                         area++;
                         ways--;
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 6490)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 6491)
@@ -112,7 +112,7 @@
                 return;
             for (Node en : s.nearbyNodes(mindist)) {
-                if (endnodes_highway.contains(en) && !s.highway && !s.isArea()) {
-                    map.put(en, s.w);
-                } else if (endnodes.contains(en) && !s.isArea()) {
+                if (endnodes_highway.contains(en) && !s.highway && !s.w.concernsArea()) {
+                    map.put(en, s.w);
+                } else if (endnodes.contains(en) && !s.w.concernsArea()) {
                     map.put(en, s.w);
                 }
@@ -294,11 +294,4 @@
             }
             return nearbyNodeCache;
-        }
-
-        public boolean isArea() {
-            return w.hasKey("landuse")
-                    || w.hasKey("leisure")
-                    || w.hasKey("amenity")
-                    || w.hasKey("building");
         }
     }
