Index: trunk/resources/data/validator/highway.mapcss
===================================================================
--- trunk/resources/data/validator/highway.mapcss	(revision 17934)
+++ trunk/resources/data/validator/highway.mapcss	(revision 17935)
@@ -165,2 +165,21 @@
   group: tr("suspicious tag combination");
 }
+
+/* #20987 */
+way[turn                ][turn                 !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;)+$/],
+way[turn:forward        ][turn:forward         !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;)+$/],
+way[turn:backward       ][turn:backward        !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;)+$/],
+way[turn:both_ways      ][turn:both_ways       !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;)+$/],
+way[turn:lanes          ][turn:lanes           !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;|\|)+$/],
+way[turn:lanes:forward  ][turn:lanes:forward   !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;|\|)+$/],
+way[turn:lanes:backward ][turn:lanes:backward  !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;|\|)+$/],
+way[turn:lanes:both_ways][turn:lanes:both_ways !~ /^((sharp_|slight_|merge_to_|slide_)?(left|right)|reverse|through|none|;|\|)+$/] {
+  throwWarning: tr("unusual value of {0}", "{0.key}");
+  assertMatch: "way turn=straight"; /* through would be correct */
+  assertMatch: "way turn=slight_reverse"; /* wrong value */
+  assertMatch: "way turn=through|right"; /*  :lanes missing in key */
+  assertNoMatch: "way turn=through;right";
+  assertMatch: "way turn:lanes:forward=straight|right"; /* through would be correct */
+  assertMatch: "way turn:lanes:forward=slight_reverse|right"; /* wrong value */
+  assertNoMatch: "way turn:lanes:forward=sharp_left;left|left;through;slight_right|slight_right;right";
+}
