Index: trunk/resources/data/validator/combinations.mapcss
===================================================================
--- trunk/resources/data/validator/combinations.mapcss	(revision 16768)
+++ trunk/resources/data/validator/combinations.mapcss	(revision 16769)
@@ -73,4 +73,5 @@
 *[source:addr:housenumber      ][!addr:housenumber] {
   throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
+  set MissingKeyWarning;
   group: tr("missing tag");
   assertMatch: "way lanes=42";
@@ -579,4 +580,22 @@
 }
 
+/* #13680 */
+area[golf=bunker][natural=beach] {
+  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
+  suggestAlternative: "natural=sand";
+  suggestAlternative: "surface=sand";
+  group: tr("suspicious tag combination");
+}
+
+/* #13705 */
+relation[type=multipolygon][building] > way {
+  set part_of_building_MP;
+}
+way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier]!.part_of_building_MP {
+  /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
+  throwOther: tr("possibly missing {0} tag", "{1.key}");
+  group: tr("missing tag");
+}
+
 /* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
 way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][turn:lanes              ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
@@ -591,22 +610,4 @@
 }
 
-/* #13680 */
-area[golf=bunker][natural=beach] {
-  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
-  suggestAlternative: "natural=sand";
-  suggestAlternative: "surface=sand";
-  group: tr("suspicious tag combination");
-}
-
-/* #13705 */
-relation[type=multipolygon][building] > way {
-  set part_of_building_MP;
-}
-way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier]!.part_of_building_MP {
-  /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
-  throwOther: tr("possibly missing {0} tag", "{1.key}");
-  group: tr("missing tag");
-}
-
 /* #14125, #14323, #18185 */
 way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][junction!=roundabout][lanes>2][get(split(".", tag(lanes)/2), 1)=5] {
@@ -618,4 +619,17 @@
   assertNoMatch: "way highway=primary lanes=4";
   assertMatch: "way highway=primary lanes=3";
+}
+
+/* #10932 */
+way[highway][!lanes][/^.*:lanes$/]!.MissingKeyWarning, 
+way[highway][!lanes:forward][/^.*:lanes:forward$/], 
+way[highway][!lanes:backward][/^.*:lanes:backward$/],
+way[highway][!lanes:both_ways][/^.*:lanes:both_ways$/] {
+  throwWarning: tr("{0} without {1}", "{2.key}", "{1.key}");
+  group: tr("missing tag");
+  assertMatch: "way highway=primary turn:lanes=left|right";
+  assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
+  assertMatch: "way highway=primary turn:lanes:forward=left|right";
+  assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
 }
 
