Index: data/validator/geometry.mapcss
===================================================================
--- data/validator/geometry.mapcss	(revision 15939)
+++ data/validator/geometry.mapcss	(working copy)
@@ -166,6 +166,12 @@
   throwWarning: tr("Building inside building");
 }
 
+/* Building overlapping building (spatial test) */
+area[building][building!~/no|entrance/][any(tag("layer"),"0") = any(parent_tag("layer"),"0")] ⧉
+area[building][building!~/no|entrance/] {
+  throwWarning: tr("Overlapping buildings");
+}
+
 /* Overlapping areas (spatial test) */
 area[natural =~ /^(water|wetland|coastline)$/], area[landuse=reservoir] {
   set water_area;
Index: src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 15939)
+++ src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -115,6 +115,9 @@
             if (areLayerOrLevelDifferent(w1, w2)) {
                 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;
             }
