Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 15787)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 15788)
@@ -17,4 +17,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
@@ -79,4 +81,5 @@
     /** often used tags which are not in presets */
     private static volatile MultiMap<String, String> oftenUsedTags = new MultiMap<>();
+    private static final Map<TaggingPreset, List<TaggingPresetItem>> presetIndex = new LinkedHashMap<>();
 
     private static final Pattern UNWANTED_NON_PRINTING_CONTROL_CHARACTERS = Pattern.compile(
@@ -244,4 +247,5 @@
         ignoreForLevenshtein.clear();
         oftenUsedTags.clear();
+        presetIndex.clear();
 
         StringBuilder errorSources = new StringBuilder();
@@ -365,6 +369,9 @@
             initAdditionalPresetsValueData();
             for (TaggingPreset p : presets) {
+                List<TaggingPresetItem> minData = new ArrayList<>();
                 for (TaggingPresetItem i : p.data) {
                     if (i instanceof KeyedItem) {
+                        if (!"none".equals(((KeyedItem) i).match))
+                            minData.add(i);
                         addPresetValue((KeyedItem) i);
                     } else if (i instanceof CheckGroup) {
@@ -373,4 +380,7 @@
                         }
                     }
+                }
+                if (!minData.isEmpty()) {
+                    presetIndex .put(p, minData);
                 }
             }
@@ -622,5 +632,11 @@
             TaggingPresetType presetType = TaggingPresetType.forPrimitive(p);
             EnumSet<TaggingPresetType> presetTypes = EnumSet.of(presetType);
-            Collection<TaggingPreset> matchingPresets = TaggingPresets.getMatchingPresets(null, tags, false);
+
+            Collection<TaggingPreset> matchingPresets = new LinkedHashSet<>();
+            for (Entry<TaggingPreset, List<TaggingPresetItem>> e : presetIndex.entrySet()) {
+                if (TaggingPresetItem.matches(e.getValue(), tags)) {
+                    matchingPresets.add(e.getKey());
+                }
+            }
             Collection<TaggingPreset> matchingPresetsOK = matchingPresets.stream().filter(
                     tp -> tp.typeMatches(presetTypes)).collect(Collectors.toList());
