Index: resources/data/validator/combinations.mapcss
===================================================================
--- resources/data/validator/highway.mapcss	(revision 17388)
+++ resources/data/validator/highway.mapcss	(working copy)
@@ -7,6 +7,9 @@
 way[highway=~/^(unclassified|residential|living_street|service)$/] {
   set minor_road;
 }
+*[highway =~ /^((motorway|trunk|primary|secondary|tertiary)(_link)?|residential|unclassified)$/] {
+set common_road;
+}
 
 /* r3669, #9384, #20117 */
 way[highway][name =~ /(?i).* (Ave|Blvd|Bnd|Br|Brg|Cct|Cir|Cl|Cr|Crct|Cres|Crt|Ct|Cv|Dr|Drv|Esp|Espl|Hwy|Ln|Mw|Mwy|Pky|Pkwy|Pl|Rd|Qy|Qys|Sq|St|Str|Ter|Tce|Tr|Trl|Vw|Wy|Xing)[.]?$/] {
@@ -163,4 +166,17 @@
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
   suggestAlternative: "kerb=*";
   group: tr("suspicious tag combination");
-}
\ No newline at end of file
+}
+
+/* #18217 */
+way:closed.common_road[area=yes],
+relation.common_road[type=multipolygon] {
+  throwError: tr("Area with {0} above {1} is invalid", "highway=*", "highway=service");
+  group: tr("suspicious tag combination");
+  suggestAlternative: "area:highway=*";
+  assertMatch:   "way highway=trunk area=yes";
+  assertMatch:   "relation highway=trunk type=multipolygon";
+  assertNoMatch: "way highway=service area=yes";
+  assertNoMatch: "way highway=trunk";
+}
+
