Index: trunk/data/validator/combinations.mapcss
===================================================================
--- trunk/data/validator/combinations.mapcss	(revision 11139)
+++ trunk/data/validator/combinations.mapcss	(revision 11146)
@@ -77,4 +77,5 @@
 *[source:maxspeed              ][!/^maxspeed:?/] {
   throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
+  group: tr("missing tag");
   assertMatch: "way lanes=42";
   assertNoMatch: "way lanes=42 highway=unclassified";
@@ -90,4 +91,5 @@
 *[leaf_cycle][!leaf_type] {
   throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
+  group: tr("missing tag");
 }
 
@@ -109,4 +111,5 @@
 *[bunker_type                  ][military!=bunker] {
   throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
+  group: tr("missing tag");
 }
 
@@ -115,4 +118,5 @@
 *[reservoir_type               ][landuse!=reservoir][water!=reservoir] {
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
+  group: tr("missing tag");
 }
 
@@ -129,4 +133,5 @@
 *[amenity=place_of_worship][!religion] {
   throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
+  group: tr("missing tag");
 }
 
@@ -144,4 +149,5 @@
 *[amenity=parking_entrance     ][!parking] {
   throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
+  group: tr("missing tag");
   assertMatch: "way power=line";
   assertNoMatch: "way power=line voltage=1";
@@ -158,4 +164,5 @@
 way[oneway][!highway][!railway] {
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
+  group: tr("missing tag");
 }
 
@@ -164,4 +171,5 @@
 *[segregated                   ][!highway][railway!=crossing] {
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
+  group: tr("missing tag");
 }
 
@@ -170,4 +178,5 @@
 *[highway=motorway_link][!oneway][junction!=roundabout] {
   throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}");
+  group: tr("missing tag");
 }
 
@@ -175,4 +184,5 @@
 *[amenity=recycling][recycling_type!=container][recycling_type!=centre] {
   throwWarning: tr("{0} without {1} or {2}", "{0.tag}", "{1.tag}", "{2.tag}");
+  group: tr("missing tag");
 }
 
@@ -181,4 +191,5 @@
 *[boat                         ][!waterway][natural!=water][landuse!=basin] {
   throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.tag}", "{3.tag}");
+  group: tr("missing tag");
 }
 
@@ -186,4 +197,5 @@
 *[snowplowing                  ][!highway][!amenity][!leisure] {
   throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
+  group: tr("missing tag");
 }
 
@@ -192,4 +204,5 @@
 *[toll                         ][!highway][!barrier][route!~/^(ferry|road)$/] {
   throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.tag}");
+  group: tr("missing tag");
 }
 
@@ -197,4 +210,5 @@
 *[noname?][name] {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
+  group: tr("suspicious tag combination");
 }
 
@@ -205,4 +219,5 @@
 way[oneway=-1 ][/:forward/][!traffic_sign:forward][bicycle:forward!=use_sidepath] {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
+  group: tr("suspicious tag combination");
 }
 
@@ -210,4 +225,5 @@
 *[highway=footway][oneway=no] {
   throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
+  group: tr("suspicious tag combination");
 }
 
@@ -215,4 +231,5 @@
 *[highway=footway][bicycle=designated] {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
+  group: tr("suspicious tag combination");
 }
 
@@ -221,4 +238,5 @@
   throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
   suggestAlternative: "bridge=aqueduct";
+  group: tr("suspicious tag combination");
   fixAdd: "bridge=aqueduct";
 }
@@ -228,4 +246,5 @@
   suggestAlternative: "waterway=dam";
   suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
+  group: tr("suspicious tag combination");
 }
 
@@ -236,4 +255,5 @@
 *[lit][eval(number_of_tags()) = 1] {
   throwWarning: tr("incomplete object: only {0}", "{0.key}");
+  group: tr("missing tag");
 }
 /* only {0.key} and {1.key}, see #11104 */
@@ -241,4 +261,5 @@
 *[name][ref][eval(number_of_tags()) = 2] {
   throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
+  group: tr("missing tag");
 }
 
@@ -248,21 +269,27 @@
 *[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
   throwWarning: tr("{0} together with addr:*", "{0.key}");
+  group: tr("suspicious tag combination");
 }
 *[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
   throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
+  group: tr("suspicious tag combination");
 }
 *[!highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
   throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
+  group: tr("suspicious tag combination");
 }
 way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
   throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
+  group: tr("suspicious tag combination");
   fixRemove: "addr:postcode";
 }
 way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
   throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
+  group: tr("suspicious tag combination");
 }
 way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
   throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
   suggestAlternative: "postal_code";
+  group: tr("suspicious tag combination");
   fixChangeKey: "addr:postcode=>postal_code";
 }
@@ -272,4 +299,5 @@
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
   suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
+  group: tr("suspicious tag combination");
 }
 
@@ -281,8 +309,10 @@
 *[maxspeed][!highway][!railway][traffic_sign !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][type != enforcement][waterway !~ /^(river|canal|lock)$/][!traffic_calming] {
   throwWarning: tr("{0} on suspicious object", "{0.key}");
-}
-
-node[amenity =~ /^(restaurant|cafe|fast_food)$/][!name][noname!=yes] {
-  throwOther: tr("restaurant without name");
+  group: tr("suspicious tag combination");
+}
+
+node[amenity][amenity =~ /^(restaurant|cafe|fast_food)$/][!name][noname!=yes] {
+  throwOther: tr("{0} without {1}", "{0.tag}", "{2.key}");
+  group: tr("missing tag");
   assertMatch: "node amenity=restaurant";
   assertNoMatch: "node amenity=restaurant noname=yes";
@@ -294,5 +324,6 @@
 way[highway][natural],
 *[landuse][building] {
-  throwWarning: tr("{0} used with {1}", "{0.key}", "{1.key}");
+  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
+  group: tr("suspicious tag combination");
   assertNoMatch: "node highway=street_lamp natural=birds_nest note=josm#10193";
 }
@@ -301,4 +332,5 @@
 *[natural=water][leisure=swimming_pool] {
   throwWarning: tr("natural water used for swimming pool");
+  group: tr("suspicious tag combination");
   fixRemove: "natural";
 }
@@ -307,4 +339,5 @@
 *[sport][!building][!club][tourism != hotel][highway != raceway][leisure !~ /^(sports_centre|stadium|track|pitch|golf_course|water_park|swimming_pool|recreation_ground|ice_rink|horse_riding)$/][natural !~ /^(beach|bare_rock|cliff|peak|water)$/][amenity !~ /^(pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/][barrier !~ /^(wall|retaining_wall)$/][!"piste:type"][shop!=sports] {
     throwWarning: tr("sport without physical feature");
+    group: tr("missing tag");
     assertMatch: "node sport=tennis";
     assertNoMatch: "node sport=tennis leisure=pitch";
@@ -318,11 +351,5 @@
 *[building:levels][!building][!building:part] {
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
-}
-
-/* #10471 */
-way[waterway] > node[ford?] { set ford_on_waterway; }
-way[highway] > node[ford?] { set ford_on_highway; }
-node[ford?]:in-downloaded-area!.ford_on_waterway, node[ford?]:in-downloaded-area!.ford_on_highway {
-    throwWarning: tr("{0} should be on the node where {1} and {2} intersect", "ford", "highway", "waterway");
+  group: tr("missing tag");
 }
 
@@ -330,4 +357,5 @@
 *[/_name$/][!name][!old_name][!loc_name][!uic_name][!artist_name][!"osak:municipality_name"][!"osak:street_name"][noname!=yes] {
   throwWarning: tr("alternative name without {0}", "{1.key}");
+  group: tr("missing tag");
 }
 
@@ -343,4 +371,5 @@
   throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
   suggestAlternative: "maxspeed";
+  group: tr("suspicious tag combination");
   fixChangeKey: "maxspeed:forward=>maxspeed";
   fixRemove: "maxspeed:backward";
@@ -350,4 +379,5 @@
   set AllSameMaxspeed;
   suggestAlternative: "maxspeed";
+  group: tr("suspicious tag combination");
   fixRemove: "maxspeed:forward";
   fixRemove: "maxspeed:backward";
@@ -355,8 +385,10 @@
 way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed {
   throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
+  group: tr("suspicious tag combination");
 }
 way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
 way["maxspeed:backward"][maxspeed][!"maxspeed:forward"] {
   throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
+  group: tr("suspicious tag combination");
 }
 
@@ -364,5 +396,6 @@
 way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
 way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
-  throwWarning: tr("Suspicious tag combination: {0} and {1}", "{2.tag}", "{0.tag}");
+  throwWarning: tr("{0} together with {1}", "{2.tag}", "{0.tag}");
+  group: tr("suspicious tag combination");
 }
 
@@ -375,7 +408,9 @@
 way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
   throwWarning: tr("Long waterway with {0} but without a tag which defines it as tunnel or underground. Remove {1} or add a tunnel tag if applicable. Also check crossing bridges and their {1} tags.", "{1.tag}", "{1.key}");
+  group: tr("suspicious tag combination");
 }
 way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
   throwOther: tr("Short waterway with {0} but without a tag which defines it as tunnel or underground. Remove {1} or add a tunnel tag if applicable. Also check crossing bridges and their {1} tags.", "{1.tag}", "{1.key}");
+  group: tr("suspicious tag combination");
 }
 
@@ -384,7 +419,9 @@
 *[unisex=yes][male=yes][female!=yes] {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
+  group: tr("suspicious tag combination");
 }
 *[unisex=yes][female=yes][male=yes] {
   throwWarning: tr("{0} together with {1} and {2}. Remove {1} and {2}", "{0.tag}", "{1.tag}", "{2.tag}");
+  group: tr("suspicious tag combination");
   fixRemove: "female";
   fixRemove: "male";
@@ -393,4 +430,5 @@
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
   suggestAlternative: "unisex=yes";
+  group: tr("suspicious tag combination");
   fixRemove: "female";
   fixRemove: "male";
@@ -401,8 +439,10 @@
 area:closed[water][natural!=water][water!=intermittent] { /* water=intermittent is deprecated and has an own warning */
   throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
+  group: tr("missing tag");
   fixAdd: "natural=water";
 }
 way!:closed[water][natural!=water][water!=intermittent] {
   throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
+  group: tr("missing tag");
 }
 
@@ -416,4 +456,5 @@
 way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
     throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
+    group: tr("suspicious tag combination");
 }
 
@@ -423,4 +464,5 @@
   suggestAlternative: "natural=sand";
   suggestAlternative: "surface=sand";
+  group: tr("suspicious tag combination");
 }
 
@@ -431,4 +473,5 @@
 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("Suspicious object: possibly missing {0} tag.", "{1.key}");
-}
+  throwOther: tr("possibly missing {0} tag", "{1.key}");
+  group: tr("missing tag");
+}
Index: trunk/data/validator/deprecated.mapcss
===================================================================
--- trunk/data/validator/deprecated.mapcss	(revision 11139)
+++ trunk/data/validator/deprecated.mapcss	(revision 11146)
@@ -929,5 +929,6 @@
 /* #12494 */
 *[/^[^t][^i][^g].+_[0-9]$/][!/^note_[0-9]$/][!/^description_[0-9]$/] {
-  throwOther: tr("questionable key (ending with a number): {0}", "{0.key}");
+  throwOther: tr("{0}", "{0.key}");
+  group: tr("questionable key (ending with a number)");
   assertMatch: "way name_1=foo";
   assertNoMatch: "way note_2=foo";
Index: trunk/data/validator/geometry.mapcss
===================================================================
--- trunk/data/validator/geometry.mapcss	(revision 11139)
+++ trunk/data/validator/geometry.mapcss	(revision 11146)
@@ -103,4 +103,5 @@
 node[leisure=park][natural=tree] {
   throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
+  group: tr("suspicious tag combination");
   fixRemove: "leisure";
 }
@@ -289,2 +290,9 @@
   throwError: tr("Coastline inside {1}", "{0.tag}");
 }
+
+/* #10471 */
+way[waterway] > node[ford?] { set ford_on_waterway; }
+way[highway] > node[ford?] { set ford_on_highway; }
+node[ford?]:in-downloaded-area!.ford_on_waterway, node[ford?]:in-downloaded-area!.ford_on_highway {
+    throwWarning: tr("{0} should be on the node where {1} and {2} intersect", "ford", "highway", "waterway");
+}
Index: trunk/data/validator/highway.mapcss
===================================================================
--- trunk/data/validator/highway.mapcss	(revision 11139)
+++ trunk/data/validator/highway.mapcss	(revision 11146)
@@ -55,4 +55,5 @@
 way.major_road[!ref] {
   throwOther: tr("highway without a reference");
+  group: tr("missing tag");
   assertMatch: "way highway=primary";
   assertNoMatch: "way highway=primary ref=123";
@@ -120,8 +121,10 @@
 way[highway =~ /^(bridleway|cycleway|footway|path|steps)$/] > node[railway != crossing].is_in_railway {
   throwWarning: tr("pedestrian railway crossing without {0}", "{0.tag}");
+  group: tr("missing tag");
   fixAdd: "railway=crossing";
 }
 way[highway =~ /^(bus_guideway|living_street|motorway|pedestrian|primary|raceway|residential|road|secondary|service|tertiary|track|trunk|unclassified)/] > node[railway != level_crossing].is_in_railway {
   throwWarning: tr("railway crossing without {0}", "{0.tag}");
+  group: tr("missing tag");
   fixAdd: "railway=level_crossing";
 }
Index: trunk/data/validator/relation.mapcss
===================================================================
--- trunk/data/validator/relation.mapcss	(revision 11139)
+++ trunk/data/validator/relation.mapcss	(revision 11146)
@@ -17,4 +17,5 @@
 relation[type=enforcement][!enforcement] {
   throwWarning: tr("{0} relation without {0} tag", "{1.key}");
+  group: tr("missing tag");
   assertMatch: "relation type=route";
   assertNoMatch: "relation type=route route=train";
Index: trunk/data/validator/religion.mapcss
===================================================================
--- trunk/data/validator/religion.mapcss	(revision 11139)
+++ trunk/data/validator/religion.mapcss	(revision 11146)
@@ -3,4 +3,5 @@
 *[religion =~ /^(christian|jewish|muslim)$/][!denomination] {
   throwOther: tr("religion without denomination");
+  group: tr("missing tag");
   assertMatch: "node religion=christian";
   assertNoMatch: "node religion=christian denomination=catholic";
Index: trunk/data/validator/unnecessary.mapcss
===================================================================
--- trunk/data/validator/unnecessary.mapcss	(revision 11139)
+++ trunk/data/validator/unnecessary.mapcss	(revision 11146)
@@ -25,5 +25,5 @@
 *[emergency=permissive] {
   /* see #9458 - emergency=permissive makes no sense */
-  throwWarning: tr("{0}={1} makes no sense", "emergency", "permissive");
+  throwWarning: tr("{0} makes no sense", "{0.tag");
   fixAdd: "emergency=yes";
   assertMatch: "way emergency=permissive";
Index: trunk/data/validator/wikipedia.mapcss
===================================================================
--- trunk/data/validator/wikipedia.mapcss	(revision 11139)
+++ trunk/data/validator/wikipedia.mapcss	(revision 11146)
@@ -19,4 +19,5 @@
   throwWarning: tr("deprecated format for wikipedia tag");
   suggestAlternative: tr("''wikipedia''=''language:page title''");
+  group: tr("deprecated tagging");
   assertMatch: "node wikipedia=http://en.wikipedia.org/wiki/OpenStreetMap";
   assertNoMatch: "node wikipedia=en:OpenStreetMap";
