Index: data/validator/highway.mapcss
===================================================================
--- data/validator/highway.mapcss	(revision 14636)
+++ data/validator/highway.mapcss	(working copy)
@@ -140,4 +140,37 @@
   throwWarning: tr("railway crossing without {0}", "{0.tag}");
   group: tr("missing tag");
   fixAdd: "railway=level_crossing";
-}
\ No newline at end of file
+}
+
+way[highway][turn:lanes][turn:lanes:forward],
+way[highway][turn:lanes][turn:lanes:backward] {
+  throwError: tr("turn:lanes and a directional turn:lanes");
+  assertMatch: "way highway=primary turn:lanes=through turn:lanes:forward=left";
+  assertMatch: "way highway=primary turn:lanes=through turn:lanes:backward=left";
+  assertNoMatch: "way highway=primary turn:lanes:forward=left";
+  assertNoMatch: "way highway=primary turn:lanes:backward=left";
+  assertNoMatch: "way highway=primary turn:lanes=through";
+}
+way[highway][turn:lanes][oneway][count(split("|", tag("turn:lanes"))) != tag("lanes")],
+way[highway][turn:lanes][!oneway][2 * count(split("|", tag("turn:lanes"))) != tag("lanes")],
+way[highway][turn:lanes][!lanes] {
+  throwWarning: tr("turn:lanes do not match lanes");
+  assertMatch: "way highway=primary lanes=4 turn:lanes=left|through|through;right";
+  assertNoMatch: "way highway=primary lanes=4 turn:lanes=left;through|through;right";
+}
+
+way[highway][turn:lanes:forward][lanes:forward][count(split("|", tag("turn:lanes:forward"))) != tag("lanes:forward")],
+way[highway][turn:lanes:forward][!lanes:forward][count(split("|", tag("turn:lanes:forward"))) != tag("lanes") / 2],
+way[highway][turn:lanes:forward][!lanes][!lanes:forward] {
+  throwWarning: tr("turn:lanes:forward do not match lanes:forward");
+  assertMatch: "way highway=primary lanes:forward=4 turn:lanes:forward=left|through|through;right";
+  assertNoMatch: "way highway=primary lanes:forward=4 turn:lanes:forward=left;through|through;right";
+}
+
+way[highway][turn:lanes:backward][lanes:backward][count(split("|", tag("turn:lanes:backward"))) != tag("lanes:backward")],
+way[highway][turn:lanes:backward][!lanes:backward][count(split("|", tag("turn:lanes:backward"))) != tag("lanes") / 2],
+way[highway][turn:lanes:backward][!lanes][!lanes:backward] {
+  throwWarning: tr("turn:lanes:backward do not match lanes:backward");
+  assertMatch: "way highway=primary lanes:backward=4 turn:lanes:backward=left|through|through;right";
+  assertNoMatch: "way highway=primary lanes:backward=4 turn:lanes:backward=left;through|through;right";
+}
