Index: /trunk/data/validator/geometry.mapcss
===================================================================
--- /trunk/data/validator/geometry.mapcss	(revision 15960)
+++ /trunk/data/validator/geometry.mapcss	(revision 15961)
@@ -167,4 +167,9 @@
 }
 
+/* Building overlapping building (spatial test) */
+area[building][building!~/no|entrance/] ⧉ area[building][building!~/no|entrance/] {
+  throwWarning: tr("Overlapping buildings");
+}
+
 /* Overlapping areas (spatial test) */
 area[natural =~ /^(water|wetland|coastline)$/], area[landuse=reservoir] {
@@ -193,5 +198,5 @@
 }
 
-area:closed:areaStyle[landuse!=residential][tag("landuse") = parent_tag("landuse")] ⧉ area:closed:areaStyle[landuse][landuse!=residential] {
+area:closed:areaStyle[tag("landuse") = parent_tag("landuse")] ⧉ area:closed:areaStyle[landuse] {
   throwWarning: tr("Overlapping Identical Landuses");
 }
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 15960)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 15961)
@@ -116,9 +116,11 @@
                 return true;
             }
+            if (isBuilding(w1) && isBuilding(w2))
+                return true;
             if (w1.hasKey(HIGHWAY) && w2.hasKey(HIGHWAY) && !Objects.equals(w1.get("level"), w2.get("level"))) {
                 return true;
             }
-            if ((w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w2))
-             || (w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w1)))
+            if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w2))
+             || ((isResidentialArea(w2) || w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w1)))
                 return true;
             if (isSubwayOrTramOrRazed(w2)) {
@@ -142,14 +144,11 @@
             if (types[0] == types[1]) {
                 switch (types[0]) {
+                // 610 and 640 where removed for #16707
                 case BARRIER:
                     return new MessageHelper(tr("Crossing barriers"), 603);
-                case BUILDING:
-                    return new MessageHelper(tr("Crossing buildings"), 610);
                 case HIGHWAY:
                     return new MessageHelper(tr("Crossing highways"), 620);
                 case RAILWAY:
                     return new MessageHelper(tr("Crossing railways"), 630);
-                case RESIDENTIAL_AREA:
-                    return new MessageHelper(tr("Crossing residential areas"), 640);
                 case WATERWAY:
                     return new MessageHelper(tr("Crossing waterways"), 650);
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java	(revision 15960)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java	(revision 15961)
@@ -126,5 +126,4 @@
         // createMessage
         testMessage(601, test, "amenity=restaurant", "amenity=restaurant");
-        testMessage(610, test, "building=yes", "building=yes");
         testMessage(611, test, "building=yes", "amenity=restaurant");
         testMessage(612, test, "building=yes", "highway=road");
@@ -139,5 +138,4 @@
         testMessage(631, test, "railway=rail", "amenity=restaurant");
         testMessage(632, test, "railway=rail", "waterway=river");
-        testMessage(640, test, "landuse=residential", "landuse=residential");
         testMessage(641, test, "landuse=residential", "amenity=restaurant");
         testMessage(650, test, "waterway=river", "waterway=river");
