Index: trunk/src/org/openstreetmap/josm/data/validation/tests/Highways.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/Highways.java	(revision 6479)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/Highways.java	(revision 6482)
@@ -10,4 +10,5 @@
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
@@ -31,4 +32,8 @@
     protected static final int WRONG_ROUNDABOUT_HIGHWAY = 2701;
     protected static final int MISSING_PEDESTRIAN_CROSSING = 2702;
+    protected static final int SOURCE_MAXSPEED_UNKNOWN_COUNTRY_CODE = 2703;
+    protected static final int SOURCE_MAXSPEED_UNKNOWN_CONTEXT = 2704;
+    protected static final int SOURCE_MAXSPEED_CONTEXT_MISMATCH_VS_MAXSPEED = 2705;
+    protected static final int SOURCE_MAXSPEED_CONTEXT_MISMATCH_VS_HIGHWAY = 2706;
 
     /**
@@ -45,4 +50,9 @@
             "living_street");
 
+    protected static final List<String> KNOWN_SOURCE_MAXSPEED_CONTEXTS = Arrays.asList(
+            "urban", "rural", "zone", "zone30", "zone:30", "nsl_single", "nsl_dual", "motorway", "trunk", "living_street");
+
+    protected static final List<String> ISO_COUNTRIES = Arrays.asList(Locale.getISOCountries());
+
     boolean leftByPedestrians = false;
     boolean leftByCyclists = false;
@@ -73,6 +83,12 @@
     @Override
     public void visit(Node n) {
-        if (n.isUsable() && !n.hasTag("highway", "crossing") && !n.hasTag("crossing", "no") && n.isReferredByWays(2)) {
-            testMissingPedestrianCrossing(n);
+        if (n.isUsable()) {
+            if (!n.hasTag("highway", "crossing") && !n.hasTag("crossing", "no") && n.isReferredByWays(2)) {
+                testMissingPedestrianCrossing(n);
+            }
+            if (n.hasKey("source:maxspeed")) {
+                // Check maxspeed but not context against highway for nodes as maxspeed is not set on highways here but on signs, speed cameras, etc.
+                testSourceMaxspeed(n, false);
+            }
         }
     }
@@ -80,6 +96,12 @@
     @Override
     public void visit(Way w) {
-        if (w.isUsable() && w.hasKey("highway") && w.hasKey("junction") && w.get("junction").equals("roundabout")) {
-            testWrongRoundabout(w);
+        if (w.isUsable()) {
+            if (w.hasKey("highway") && w.hasKey("junction") && w.get("junction").equals("roundabout")) {
+                testWrongRoundabout(w);
+            }
+            if (w.hasKey("source:maxspeed")) {
+                // Check maxspeed, including context against highway
+                testSourceMaxspeed(w, true);
+            }
         }
     }
@@ -173,4 +195,23 @@
         }
     }
+    
+    private void testSourceMaxspeed(OsmPrimitive p, boolean testContextHighway) {
+        String value = p.get("source:maxspeed");
+        if (value.matches("[A-Z]{2}:.+")) {
+            int index = value.indexOf(':');
+            // Check country
+            String country = value.substring(0, index);
+            if (!ISO_COUNTRIES.contains(country)) {
+                errors.add(new TestError(this, Severity.WARNING, tr("Unknown country code: {0}", country), SOURCE_MAXSPEED_UNKNOWN_COUNTRY_CODE, p));
+            }
+            // Check context
+            String context = value.substring(index+1);
+            if (!KNOWN_SOURCE_MAXSPEED_CONTEXTS.contains(context)) {
+                errors.add(new TestError(this, Severity.WARNING, tr("Unknown source:maxspeed context: {0}", context), SOURCE_MAXSPEED_UNKNOWN_CONTEXT, p));
+            }
+            // TODO: Check coherence of context against maxspeed
+            // TODO: Check coherence of context against highway
+        }
+    }
 
     @Override
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 6479)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 6482)
@@ -73,7 +73,7 @@
     
     /** The default data files */
-    public static final String DATA_FILE = "resource://data/tagchecker.cfg";
-    public static final String IGNORE_FILE = "resource://data/ignoretags.cfg";
-    public static final String SPELL_FILE = "resource://data/words.cfg";
+    public static final String DATA_FILE = "resource://data/validator/tagchecker.cfg";
+    public static final String IGNORE_FILE = "resource://data/validator/ignoretags.cfg";
+    public static final String SPELL_FILE = "resource://data/validator/words.cfg";
 
     /** The spell check key substitutions: the key should be substituted by the value */
