Index: trunk/src/org/openstreetmap/josm/data/validation/tests/Lanes.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/Lanes.java	(revision 6597)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/Lanes.java	(revision 6598)
@@ -10,4 +10,5 @@
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -24,19 +25,28 @@
     }
 
-    protected void checkEqualNumberOfLanes(final OsmPrimitive p, Pattern keyPattern, String message) {
-        final Collection<String> keysForPattern = Utils.filter(p.keySet(), Predicates.stringContainsPattern(keyPattern));
-        if (keysForPattern.size() < 2) {
+    protected void checkEqualNumberOfLanes(final OsmPrimitive p, String lanesKey, String message) {
+        final Collection<String> keysForPattern = Utils.filter(p.keySet(),
+                Predicates.stringContainsPattern(Pattern.compile(":" + lanesKey + "$")));
+        if (keysForPattern.size() < 1) {
             // nothing to check
             return;
         }
-        final Collection<Integer> lanesCount = Utils.transform(keysForPattern, new Utils.Function<String, Integer>() {
+        final Set<Integer> lanesCount = new HashSet<Integer>(Utils.transform(keysForPattern, new Utils.Function<String, Integer>() {
             @Override
             public Integer apply(String key) {
                 return getLanesCount(p.get(key));
             }
-        });
-        // if not all numbers are the same
-        if (new HashSet<Integer>(lanesCount).size() > 1) {
+        }));
+        if (lanesCount.size() > 1) {
+            // if not all numbers are the same
             errors.add(new TestError(this, Severity.WARNING, message, 3100, p));
+        } else if (lanesCount.size() == 1 && p.hasKey(lanesKey)) {
+            // ensure that lanes <= *:lanes
+            try {
+                if (Integer.parseInt(p.get(lanesKey)) > lanesCount.iterator().next()) {
+                    errors.add(new TestError(this, Severity.WARNING, tr("Number of {0} greater than {1}", lanesKey, "*:" + lanesKey), 3100, p));
+                }
+            } catch (NumberFormatException ignore) {
+            }
         }
     }
@@ -44,7 +54,7 @@
     @Override
     public void check(OsmPrimitive p) {
-        checkEqualNumberOfLanes(p, Pattern.compile(":lanes$"), tr("Number of lane dependent values inconsistent"));
-        checkEqualNumberOfLanes(p, Pattern.compile(":lanes:forward"), tr("Number of lane dependent values inconsistent in forward direction"));
-        checkEqualNumberOfLanes(p, Pattern.compile(":lanes:backward"), tr("Number of lane dependent values inconsistent in backward direction"));
+        checkEqualNumberOfLanes(p, "lanes", tr("Number of lane dependent values inconsistent"));
+        checkEqualNumberOfLanes(p, "lanes:forward", tr("Number of lane dependent values inconsistent in forward direction"));
+        checkEqualNumberOfLanes(p, "lanes:backward", tr("Number of lane dependent values inconsistent in backward direction"));
     }
 }
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.groovy	(revision 6597)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.groovy	(revision 6598)
@@ -39,3 +39,13 @@
         assert lanes.errors.get(0).getMessage() == "Number of lane dependent values inconsistent in forward direction"
     }
+
+    void test5() {
+        lanes.check(TestUtils.createPrimitive("way lanes:forward=5 turn:lanes:forward=left|right"))
+        assert lanes.errors.get(0).getMessage() == "Number of lanes:forward greater than *:lanes:forward"
+    }
+
+    void test6() {
+        lanes.check(TestUtils.createPrimitive("way lanes:forward=foo|bar turn:lanes:forward=foo+bar"))
+        assert lanes.errors.isEmpty()
+    }
 }
