Index: resources/data/validator/combinations.mapcss
===================================================================
--- resources/data/validator/combinations.mapcss	(revision 17923)
+++ resources/data/validator/combinations.mapcss	(working copy)
@@ -344,31 +344,47 @@
   group: tr("suspicious tag combination");
 }
 
-/* only {0.key}, #11104, #12422, #14950, #19572 */
-*[lanes][eval(number_of_tags()) = 1],
-*[surface][eval(number_of_tags()) = 1],
-*[access][eval(number_of_tags()) = 1],
-*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
-*[name][eval(number_of_tags()) = 1],
-*[ref][eval(number_of_tags()) = 1],
-*[lit][eval(number_of_tags()) = 1] {
+/* only {0.key}, #11104, #12422, #14950, #19572, #20902 */
+/* relations excluded as there is a test for missing type=* plus several other test depending on the type exist */
+node[access][eval(number_of_tags()) = 1],
+way[access][eval(number_of_tags()) = 1],
+node[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
+way[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
+node[lanes][eval(number_of_tags()) = 1],
+way[lanes][eval(number_of_tags()) = 1],
+node[layer][eval(number_of_tags()) = 1],
+way[layer][eval(number_of_tags()) = 1],
+way[level][eval(number_of_tags()) = 1], /* nodes might be valid */
+node[lit][eval(number_of_tags()) = 1],
+way[lit][eval(number_of_tags()) = 1],
+node[name][eval(number_of_tags()) = 1],
+way[name][eval(number_of_tags()) = 1],
+node[ref][eval(number_of_tags()) = 1],
+way[ref][eval(number_of_tags()) = 1],
+node[surface][eval(number_of_tags()) = 1],
+way[surface][eval(number_of_tags()) = 1] {
   throwWarning: tr("incomplete object: only {0}", "{0.key}");
   set only_one_tag;
   group: tr("missing tag");
 }
 /* only {0.key} and {1.key} */
-*[name][area][eval(number_of_tags()) = 2],
-*[name][ref][eval(number_of_tags()) = 2] {
+node[name][area][eval(number_of_tags()) = 2],
+way[name][area][eval(number_of_tags()) = 2],
+node[name][ref][eval(number_of_tags()) = 2],
+way[name][ref][eval(number_of_tags()) = 2] {
   throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
   group: tr("missing tag");
 }
 /* only {0.tag}, #15269 */
-*[tourism=attraction][eval(number_of_tags()) = 1] {
+node[tourism=attraction][eval(number_of_tags()) = 1], 
+way[tourism=attraction][eval(number_of_tags()) = 1] {
   throwWarning: tr("incomplete object: only {0}", "{0.tag}");
   group: tr("missing tag");
 }
 /* only {0.key} and {1.tag} */
-*[name][tourism=attraction][eval(number_of_tags()) = 2] {
+node[name][tourism=attraction][eval(number_of_tags()) = 2],
+way[name][tourism=attraction][eval(number_of_tags()) = 2],
+relation[name][tourism=attraction][eval(number_of_tags()) = 3][type=site] {
   throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
   group: tr("missing tag");
 }
Index: resources/data/validator/combinations.mapcss
===================================================================
--- resources/data/validator/unnecessary.mapcss	(revision 17947)
+++ resources/data/validator/unnecessary.mapcss	(working copy)
@@ -19,16 +19,22 @@
   assertNoMatch: "way highway=motorway access=no motor_vehicle=yes";
 }
 
-area:closed[amenity ][area?][!highway],
-area:closed[building][area?],
-area:closed[landuse ][area?][!highway],
-area:closed[leisure ][area?][!highway][leisure!=track][leisure!=slipway],
-area:closed[natural ][area?],
-area:closed[shop    ][area?] {
+way:closed[amenity ][area?][!highway],
+way:closed[building][area?],
+way:closed[landuse ][area?][!highway],
+way:closed[leisure ][area?][!highway][leisure!=track][leisure!=slipway],
+way:closed[natural ][area?],
+way:closed[shop    ][area?] {
   throwWarning: tr("{0} is unnecessary for {1}", "{2.tag}", "{1.key}");
   group: tr("unnecessary tag");
   fixRemove: "{2.key}";
 }
+/* #20902 */
+relation[area?] {
+  throwWarning: tr("{0} is unnecessary for {1}", "{0.key}", "relations");
+  group: tr("unnecessary tag");
+  fixRemove: "{0.key}";
+}
 
 /* #14256, #15664 */
 area:closed[highway=rest_area][area?],
