Index: plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/NameMismatch.java
===================================================================
--- plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/NameMismatch.java	(revision 0)
+++ plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/NameMismatch.java	(revision 0)
@@ -0,0 +1,71 @@
+package org.openstreetmap.josm.plugins.validator.tests;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.plugins.validator.Severity;
+import org.openstreetmap.josm.plugins.validator.Test;
+import org.openstreetmap.josm.plugins.validator.TestError;
+
+/**
+ * Check for name not equal to any name:*
+ * <p>
+ * This test finds multilingual objects whose 'name' attribute is not
+ * equal to any 'name:*' attribute.  For example, a node with
+ * name=Europe, name:de=Europa should have name:en=Europe to avoid
+ * triggering this test.
+ *
+ * @author Skela
+ */
+public class NameMismatch extends Test {
+    protected static final int NAME_MISMATCH = 1401;
+
+    public NameMismatch() {
+        super(tr("Name not equal to any name:*"),
+            tr("This test finds multilingual objects whose 'name' attribute is not equal to any 'name:*' attribute."));
+    }
+
+    /**
+     * Check a primitive for a name mismatch.
+     *
+     * @param p The primitive to be tested
+     */
+    private void check(OsmPrimitive p) {
+	HashSet<String> names = new HashSet<String>();
+
+	for (String key : p.keySet()) {
+		if (key.startsWith("name:")) {
+			String name_s = p.get(key);
+			if (name_s != null) {
+				names.add(name_s);
+			}
+		}
+	}
+
+	if (names.isEmpty()) return;
+
+	String name = p.get("name");
+
+	if (name == null || names.contains(name)) return;
+
+	errors.add(new TestError(this, Severity.OTHER,
+				 tr("name not equal to any name:*"),
+				 NAME_MISMATCH, p));
+    }
+
+    /**
+     * Checks a name mismatch in all primitives.
+     *
+     * @param selection The primitives to be tested
+     */
+    @Override public void visit(Collection<OsmPrimitive> selection)
+    {
+        for (OsmPrimitive p : selection) {
+            if(!p.isDeleted() && !p.incomplete)
+                check(p);
+        }
+    }
+}
Index: plugins/validator/src/org/openstreetmap/josm/plugins/validator/OSMValidatorPlugin.java
===================================================================
--- plugins/validator/src/org/openstreetmap/josm/plugins/validator/OSMValidatorPlugin.java	(revision 17472)
+++ plugins/validator/src/org/openstreetmap/josm/plugins/validator/OSMValidatorPlugin.java	(working copy)
@@ -39,6 +39,7 @@ import org.openstreetmap.josm.plugins.va
 import org.openstreetmap.josm.plugins.validator.tests.CrossingWays;
 import org.openstreetmap.josm.plugins.validator.tests.DuplicateNode;
 import org.openstreetmap.josm.plugins.validator.tests.DuplicatedWayNodes;
+import org.openstreetmap.josm.plugins.validator.tests.NameMismatch;
 import org.openstreetmap.josm.plugins.validator.tests.NodesWithSameName;
 import org.openstreetmap.josm.plugins.validator.tests.OverlappingWays;
 import org.openstreetmap.josm.plugins.validator.tests.SelfIntersectingWay;
@@ -96,6 +97,7 @@ public class OSMValidatorPlugin extends 
             UnclosedWays.class, // ID 1101 .. 1199
             TagChecker.class, // ID 1201 .. 1299
             UnconnectedWays.class, // ID 1301 .. 1399
+            NameMismatch.class, // ID  1401 ..  1499
     };
 
     /**
