Index: trunk/data/validator/combinations.mapcss
===================================================================
--- trunk/data/validator/combinations.mapcss	(revision 8699)
+++ trunk/data/validator/combinations.mapcss	(revision 8700)
@@ -285,2 +285,24 @@
   suggestAlternative: "destination:backward";
 }
+
+/* see #11389 */
+way["maxspeed:forward"=*"maxspeed:backward"][!maxspeed] {
+  throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
+  suggestAlternative: "maxspeed";
+  fixChangeKey: "maxspeed:forward=>maxspeed";
+  fixRemove: "maxspeed:backward";
+}
+way["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed][maxspeed] {
+  throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
+  set AllSameMaxspeed;
+  suggestAlternative: "maxspeed";
+  fixRemove: "maxspeed:forward";
+  fixRemove: "maxspeed:backward";
+}
+way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed {
+  throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
+}
+way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
+way["maxspeed:backward"][maxspeed][!"maxspeed:forward"] {
+  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
+}
Index: trunk/data/validator/numeric.mapcss
===================================================================
--- trunk/data/validator/numeric.mapcss	(revision 8699)
+++ trunk/data/validator/numeric.mapcss	(revision 8700)
@@ -81,6 +81,7 @@
   assertNoMatch: "way maxwidth=7 ft";
 }
-
-way[maxspeed][maxspeed !~ /^(signals|none|unposted|unknown|variable|walk|[1-9][0-9]*( [a-z]+)?|[A-Z][A-Z]:(urban|rural|living_street|motorway))$/] {
+way[maxspeed][maxspeed !~ /^(signals|none|unposted|variable|walk|[1-9][0-9]*( [a-z]+)?|[A-Z][A-Z]:(urban|rural|living_street|motorway))$/],
+way[maxspeed:forward][maxspeed:forward !~ /^(signals|none|unposted|variable|walk|[1-9][0-9]*( [a-z]+)?|[A-Z][A-Z]:(urban|rural|living_street|motorway))$/],
+way[maxspeed:backward][maxspeed:backward !~ /^(signals|none|unposted|variable|walk|[1-9][0-9]*( [a-z]+)?|[A-Z][A-Z]:(urban|rural|living_street|motorway))$/] {
   throwWarning: tr("unusual {0} format", "maxspeed");
   assertMatch: "way maxspeed=something";
