Index: trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 9930)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 9932)
@@ -25,5 +25,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
-import org.openstreetmap.josm.gui.tagging.presets.items.Key;
+import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles.Role;
@@ -145,17 +145,6 @@
 
         for (TaggingPreset p : relationpresets) {
-            boolean matches = true;
-            Roles r = null;
-            for (TaggingPresetItem i : p.data) {
-                if (i instanceof Key) {
-                    Key k = (Key) i;
-                    if (!k.value.equals(n.get(k.key))) {
-                        matches = false;
-                        break;
-                    }
-                } else if (i instanceof Roles) {
-                    r = (Roles) i;
-                }
-            }
+            final boolean matches = TaggingPresetItem.matches(Utils.filteredCollection(p.data, KeyedItem.class), n.getKeys());
+            final Roles r = Utils.find(p.data, Roles.class);
             if (matches && r != null) {
                 for (Role role: r.roles) {
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 9930)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 9932)
@@ -562,14 +562,6 @@
         else if (!typeMatches(t))
             return false;
-        boolean atLeastOnePositiveMatch = false;
-        for (TaggingPresetItem item : data) {
-            Boolean m = item.matches(tags);
-            if (m != null && !m)
-                return false;
-            else if (m != null) {
-                atLeastOnePositiveMatch = true;
-            }
-        }
-        return atLeastOnePositiveMatch;
+        else
+            return TaggingPresetItem.matches(data, tags);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 9930)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 9932)
@@ -134,3 +134,23 @@
         return imgProv.get();
     }
+
+    /**
+     * Determine whether the given preset items match the tags
+     * @param data the preset items
+     * @param tags the tags to match
+     * @return whether the given preset items match the tags
+     * @sice 9932
+     */
+    public static boolean matches(Iterable<? extends TaggingPresetItem> data, Map<String, String> tags) {
+        boolean atLeastOnePositiveMatch = false;
+        for (TaggingPresetItem item : data) {
+            Boolean m = item.matches(tags);
+            if (m != null && !m)
+                return false;
+            else if (m != null) {
+                atLeastOnePositiveMatch = true;
+            }
+        }
+        return atLeastOnePositiveMatch;
+    }
 }
