Index: trunk/data/validator/highway.mapcss
===================================================================
--- trunk/data/validator/highway.mapcss	(revision 13000)
+++ trunk/data/validator/highway.mapcss	(revision 13005)
@@ -86,9 +86,9 @@
 }
 
-/* footway, see #10851, #10976 */
-way[footway=left][/footway:/],
-way[footway=right][/footway:/],
-way[footway=both][/footway:/],
-way[footway=no][/footway:/] {
+/* footway, see #10851, #10976, #15439 */
+way[footway=left][/^footway:/],
+way[footway=right][/^footway:/],
+way[footway=both][/^footway:/],
+way[footway=no][/^footway:/] {
   throwWarning: tr("{0} is deprecated, use {1} instead. Also check similar tags like {2}", "{0.tag}", "sidewalk", "{1.key}");
   group: tr("deprecated tagging");
@@ -127,8 +127,8 @@
 }
 
-/* #11270, #9297 */
+/* #11270, #9297, #15439 */
 way[railway =~ /^(light_rail|miniature|narrow_gauge|preserved|rail)$/][!highway] > node { set .is_in_railway }
 way[highway =~ /^(bridleway|cycleway|footway|path|steps)$/] > node { set .is_in_minor_road }
-way[highway =~ /^(bus_guideway|living_street|motorway|pedestrian|primary|raceway|residential|road|secondary|service|tertiary|track|trunk|unclassified)/] > node { set .is_in_major_road }
+way[highway =~ /^(bus_guideway|living_street|motorway|motorway_link|pedestrian|primary|primary_link|raceway|residential|road|secondary|secondary_link|service|tertiary|tertiary_link|track|trunk|trunk_link|unclassified)$/] > node { set .is_in_major_road }
 node[railway!=crossing].is_in_railway.is_in_minor_road!.is_in_major_road {
   throwWarning: tr("pedestrian railway crossing without {0}", "{0.tag}");
Index: trunk/data/validator/numeric.mapcss
===================================================================
--- trunk/data/validator/numeric.mapcss	(revision 13000)
+++ trunk/data/validator/numeric.mapcss	(revision 13005)
@@ -7,5 +7,5 @@
 }
 
-*[layer =~ /\+.*/] {
+*[layer =~ /^\+\d/] {
   throwWarning: tr("layer tag with + sign");
   fixAdd: concat("layer=", replace(tag("layer"), "+", ""));
@@ -13,4 +13,5 @@
   assertNoMatch: "node layer=1";
   assertNoMatch: "node layer=-1";
+  assertNoMatch: "node layer=+foo";
 }
 
Index: trunk/data/validator/unnecessary.mapcss
===================================================================
--- trunk/data/validator/unnecessary.mapcss	(revision 13000)
+++ trunk/data/validator/unnecessary.mapcss	(revision 13005)
@@ -1,4 +1,4 @@
 *[access][highway=proposed],
-*[motor_vehicle?][vehicle!=no][access!=no][bicycle_road!=yes][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service|living_street/],
+*[motor_vehicle?][vehicle!=no][access!=no][bicycle_road!=yes][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/],
 *[bridge=no],
 *[building=no],
