Index: src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java	(revision 17476)
+++ src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java	(working copy)
@@ -179,7 +179,7 @@
     private MultiMap<RelationPair, OsmPrimitive> relations;
 
     /** MultiMap of all relations, regardless of keys */
-    private MultiMap<List<RelationMember>, OsmPrimitive> relationsNoKeys;
+    private MultiMap<List<RelationMember>, Relation> relationsNoKeys;
 
     /** List of keys without useful information */
     private final Set<String> ignoreKeys = new HashSet<>(AbstractPrimitive.getUninterestingKeys());
@@ -211,25 +211,55 @@
             }
         }
         relations = null;
-        for (Set<OsmPrimitive> duplicated : relationsNoKeys.values()) {
+        for (Set<Relation> duplicated : relationsNoKeys.values()) {
             if (duplicated.size() > 1) {
-                TestError testError = TestError.builder(this, Severity.OTHER, SAME_RELATION)
-                        .message(tr("Relations with same members"))
+                Set<Relation> realDups = compareKeys(duplicated);
+                if (realDups.size() < duplicated.size()) {
+                    TestError testError = TestError.builder(this, Severity.OTHER, SAME_RELATION)
+                            .message(tr("Relations with same members"))
+                            .primitives(duplicated)
+                            .build();
+                    errors.add(testError);
+                }
+            }
+        }
+        relationsNoKeys = null;
+        super.endTest();
+    }
+
+    private Set<Relation> compareKeys(Set<Relation> sameMembers) {
+        Set<Relation> realDups = new HashSet<>();
+        MultiMap<Map<String, String>, Relation> sameKeys = new MultiMap<>();
+        for (Relation r :sameMembers) {
+            Map<String, String> rkeys = r.getKeys();
+            for (String key : ignoreKeys) {
+                rkeys.remove(key);
+            }
+            sameKeys.put(rkeys, r);
+        }
+        for (Set<Relation> duplicated : sameKeys.values()) {
+            if (duplicated.size() > 1) {
+                TestError testError = TestError.builder(this, Severity.ERROR, DUPLICATE_RELATION)
+                        .message(tr("Duplicated relations"))
                         .primitives(duplicated)
                         .build();
                 errors.add(testError);
             }
+            realDups.addAll(duplicated);
         }
-        relationsNoKeys = null;
-        super.endTest();
+        return realDups;
     }
 
     @Override
     public void visit(Relation r) {
-        if (!r.isUsable() || r.hasIncompleteMembers() || "tmc".equals(r.get("type")) || "TMC".equals(r.get("type"))
-               || "destination_sign".equals(r.get("type")) || r.getMembers().isEmpty())
+        if (!r.isUsable() || r.getMembers().isEmpty())
             return;
         List<RelationMember> rMembers = r.getMembers();
+        relationsNoKeys.put(rMembers, r);
+
+        if (r.hasIncompleteMembers() || "tmc".equals(r.get("type")) || "TMC".equals(r.get("type"))
+                || "destination_sign".equals(r.get("type")))
+             return;
         Map<String, String> rkeys = r.getKeys();
         for (String key : ignoreKeys) {
             rkeys.remove(key);
@@ -236,7 +266,6 @@
         }
         RelationPair rKey = new RelationPair(rMembers, rkeys);
         relations.put(rKey, r);
-        relationsNoKeys.put(rMembers, r);
     }
 
     /**
