Index: src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 11249)
+++ src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(working copy)
@@ -68,8 +68,8 @@
 
     /** Normalized keys: the key should be substituted by the value if the key was not found in presets */
     private static final Map<String, String> harmonizedKeys = new HashMap<>();
-    /** The spell check preset values */
-    private static volatile MultiMap<String, String> presetsValueData;
+    /** The spell check preset values which are not stored in TaggingPresets */
+    private static volatile MultiMap<String, String> additinalPresetsValueData;
     /** The TagChecker data */
     private static final List<CheckerData> checkerData = new ArrayList<>();
     private static final List<String> ignoreDataStartsWith = new ArrayList<>();
@@ -258,14 +258,14 @@
 
         Collection<TaggingPreset> presets = TaggingPresets.getTaggingPresets();
         if (!presets.isEmpty()) {
-            presetsValueData = new MultiMap<>();
+            additinalPresetsValueData = new MultiMap<>();
             for (String a : OsmPrimitive.getUninterestingKeys()) {
-                presetsValueData.putVoid(a);
+                additinalPresetsValueData.putVoid(a);
             }
             // TODO directionKeys are no longer in OsmPrimitive (search pattern is used instead)
             for (String a : Main.pref.getCollection(ValidatorPreference.PREFIX + ".knownkeys",
                     Arrays.asList(new String[]{"is_in", "int_ref", "fixme", "population"}))) {
-                presetsValueData.putVoid(a);
+                additinalPresetsValueData.putVoid(a);
             }
             for (TaggingPreset p : presets) {
                 for (TaggingPresetItem i : p.data) {
@@ -285,7 +285,6 @@
         Collection<String> values = ky.getValues();
         if (ky.key != null && values != null) {
             try {
-                presetsValueData.putAll(ky.key, values);
                 harmonizedKeys.put(harmonizeKey(ky.key), ky.key);
             } catch (NullPointerException e) {
                 Main.error(e, p+": Unable to initialize "+ky+'.');
@@ -308,6 +307,13 @@
         return false;
     }
 
+    private static Set<String> getPresetValues(String key) {
+        Set<String> res = TaggingPresets.PRESET_TAG_CACHE.get(key);
+        if (res != null)
+            return res;
+        return additinalPresetsValueData.get(key);
+    }
+
     /**
      * Determines if the given key is in internal presets.
      * @param key key
@@ -315,7 +321,7 @@
      * @since 9023
      */
     public static boolean isKeyInPresets(String key) {
-        return presetsValueData.get(key) != null;
+        return getPresetValues(key) != null;
     }
 
     /**
@@ -326,7 +332,7 @@
      * @since 9023
      */
     public static boolean isTagInPresets(String key, String value) {
-        final Set<String> values = presetsValueData.get(key);
+        final Set<String> values = getPresetValues(key);
         return values != null && (values.isEmpty() || values.contains(value));
     }
 
@@ -465,7 +471,7 @@
                         .build());
                 withErrors.put(p, "HTML");
             }
-            if (checkValues && key != null && value != null && !value.isEmpty() && presetsValueData != null) {
+            if (checkValues && key != null && value != null && !value.isEmpty() && additinalPresetsValueData != null) {
                 if (!isTagIgnored(key, value)) {
                     if (!isKeyInPresets(key)) {
                         String prettifiedKey = harmonizeKey(key);
@@ -491,7 +497,7 @@
                     } else if (!isTagInPresets(key, value)) {
                         // try to fix common typos and check again if value is still unknown
                         String fixedValue = harmonizeValue(prop.getValue());
-                        Map<String, String> possibleValues = getPossibleValues(presetsValueData.get(key));
+                        Map<String, String> possibleValues = getPossibleValues(getPresetValues(key));
                         if (possibleValues.containsKey(fixedValue)) {
                             final String newKey = possibleValues.get(fixedValue);
                             // misspelled preset value
Index: src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java	(revision 11249)
+++ src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java	(working copy)
@@ -14,7 +14,6 @@
 import java.util.Set;
 import java.util.function.Function;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -112,11 +111,6 @@
     protected MultiMap<String, String> tagCache;
 
     /**
-     * the same as tagCache but for the preset keys and values can be accessed directly
-     */
-    protected static final MultiMap<String, String> PRESET_TAG_CACHE = new MultiMap<>();
-
-    /**
      * Cache for tags that have been entered by the user.
      */
     protected static final Set<UserInputTag> USER_INPUT_TAG_CACHE = new LinkedHashSet<>();
@@ -215,16 +209,7 @@
     }
 
     protected static void cachePresetItem(TaggingPreset p, TaggingPresetItem item) {
-        if (item instanceof KeyedItem) {
-            KeyedItem ki = (KeyedItem) item;
-            if (ki.key != null && ki.getValues() != null) {
-                try {
-                    PRESET_TAG_CACHE.putAll(ki.key, ki.getValues());
-                } catch (NullPointerException e) {
-                    Main.error(e, p + ": Unable to cache " + ki);
-                }
-            }
-        } else if (item instanceof Roles) {
+        if (item instanceof Roles) {
             Roles r = (Roles) item;
             for (Role i : r.roles) {
                 if (i.key != null) {
@@ -260,7 +245,7 @@
     }
 
     protected List<String> getPresetKeys() {
-        return new ArrayList<>(PRESET_TAG_CACHE.keySet());
+        return new ArrayList<>(TaggingPresets.PRESET_TAG_CACHE.keySet());
     }
 
     protected Collection<String> getUserInputKeys() {
@@ -286,7 +271,7 @@
     }
 
     protected static List<String> getPresetValues(String key) {
-        return new ArrayList<>(PRESET_TAG_CACHE.getValues(key));
+        return new ArrayList<>(TaggingPresets.PRESET_TAG_CACHE.getValues(key));
     }
 
     protected static Collection<String> getUserInputValues(String key) {
Index: src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java	(revision 11249)
+++ src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java	(working copy)
@@ -14,6 +14,10 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MenuScroller;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.tagging.presets.items.CheckGroup;
+import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
+import org.openstreetmap.josm.gui.tagging.presets.items.Roles;
+import org.openstreetmap.josm.tools.MultiMap;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 
 /**
@@ -25,6 +29,9 @@
     /** The collection of tagging presets */
     private static final Collection<TaggingPreset> taggingPresets = new ArrayList<>();
 
+    /** cache for key/value pairs found in the preset */
+    public static final MultiMap<String, String> PRESET_TAG_CACHE = new MultiMap<>();
+
     /** The collection of listeners */
     private static final Collection<TaggingPresetListener> listeners = new ArrayList<>();
 
@@ -38,6 +45,7 @@
     public static void readFromPreferences() {
         taggingPresets.clear();
         taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false));
+        cachePresets(taggingPresets);
     }
 
     /**
@@ -87,6 +95,36 @@
     }
 
     /**
+     * Initialize the cache for presets. This is done only once.
+     * @param presets Tagging presets to cache
+     */
+    private static void cachePresets(Collection<TaggingPreset> presets) {
+        for (final TaggingPreset p : presets) {
+            for (TaggingPresetItem item : p.data) {
+                cachePresetItem(p, item);
+            }
+        }
+    }
+
+    private static void cachePresetItem(TaggingPreset p, TaggingPresetItem item) {
+        if (item instanceof KeyedItem) {
+            KeyedItem ki = (KeyedItem) item;
+            if (ki.key != null && ki.getValues() != null) {
+                try {
+                    PRESET_TAG_CACHE.putAll(ki.key, ki.getValues());
+                } catch (NullPointerException e) {
+                    Main.error(e, p + ": Unable to cache " + ki);
+                }
+            }
+        } else if (item instanceof Roles) {
+        } else if (item instanceof CheckGroup) {
+            for (KeyedItem check : ((CheckGroup) item).checks) {
+                cachePresetItem(p, check);
+            }
+        }
+    }
+
+    /**
      * Replies a new collection containing all tagging presets.
      * @return a new collection containing all tagging presets. Empty if presets are not initialized (never null)
      */
