Index: src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 14997)
+++ src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(working copy)
@@ -864,7 +864,7 @@
                     if (!ignoreError && !check.errors.isEmpty()) {
                         final TestError error = check.getErrorForPrimitive(p, r.selector, env, new MapCSSTagCheckerAndRule(check.rule));
                         if (error != null) {
-                            res.add(error);
+                            addIfNotDuplicate(error, errors);
                         }
                     }
 
@@ -874,6 +874,23 @@
         return res;
     }
 
+    private static void addIfNotDuplicate(TestError toAdd, List<TestError> errors) {
+        boolean isDup = false;
+        if (toAdd.getPrimitives().size() >= 2) {
+            // make sure that we don't report the same error for the same combination of primitives in different order
+            for (TestError e : errors) {
+                if (e.getCode() == toAdd.getCode() && e.getMessage().equals(toAdd.getMessage())
+                        && e.getPrimitives().size() == toAdd.getPrimitives().size()
+                        && e.getPrimitives().containsAll(toAdd.getPrimitives())) {
+                    isDup = true;
+                    break;
+                }
+            }
+        }
+        if (!isDup)
+            errors.add(toAdd);
+    }
+
     private static Collection<TestError> getErrorsForPrimitive(OsmPrimitive p, boolean includeOtherSeverity,
             Collection<Set<TagCheck>> checksCol) {
         final List<TestError> r = new ArrayList<>();
