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;
@@ -29,11 +28,7 @@
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
-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.gui.tagging.presets.items.Roles.Role;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.MultiMap;
@@ -112,11 +107,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<>();
@@ -129,11 +119,6 @@
     protected Set<String> roleCache;
 
     /**
-     * the same as roleCache but for the preset roles can be accessed directly
-     */
-    protected static final Set<String> PRESET_ROLE_CACHE = new HashSet<>();
-
-    /**
      * Constructs a new {@code AutoCompletionManager}.
      * @param ds data set
      */
@@ -203,42 +188,6 @@
     }
 
     /**
-     * Initialize the cache for presets. This is done only once.
-     * @param presets Tagging presets to cache
-     */
-    public static void cachePresets(Collection<TaggingPreset> presets) {
-        for (final TaggingPreset p : presets) {
-            for (TaggingPresetItem item : p.data) {
-                cachePresetItem(p, item);
-            }
-        }
-    }
-
-    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) {
-            Roles r = (Roles) item;
-            for (Role i : r.roles) {
-                if (i.key != null) {
-                    PRESET_ROLE_CACHE.add(i.key);
-                }
-            }
-        } else if (item instanceof CheckGroup) {
-            for (KeyedItem check : ((CheckGroup) item).checks) {
-                cachePresetItem(p, check);
-            }
-        }
-    }
-
-    /**
      * Remembers user input for the given key/value.
      * @param key Tag key
      * @param value Tag value
@@ -260,7 +209,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 +235,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) {
@@ -316,7 +265,7 @@
      * @param list the list to populate
      */
     public void populateWithMemberRoles(AutoCompletionList list) {
-        list.add(PRESET_ROLE_CACHE, AutoCompletionItemPriority.IS_IN_STANDARD);
+        list.add(TaggingPresets.PRESET_ROLE_CACHE, AutoCompletionItemPriority.IS_IN_STANDARD);
         list.add(getRoleCache(), AutoCompletionItemPriority.IS_IN_DATASET);
     }
 
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)
@@ -4,7 +4,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
@@ -13,7 +15,11 @@
 import org.openstreetmap.josm.Main;
 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.gui.tagging.presets.items.Roles.Role;
+import org.openstreetmap.josm.tools.MultiMap;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 
 /**
@@ -25,6 +31,11 @@
     /** 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<>();
+    /** cache for roles found in the preset */
+    public static final Set<String> PRESET_ROLE_CACHE = new HashSet<>();
+
     /** The collection of listeners */
     private static final Collection<TaggingPresetListener> listeners = new ArrayList<>();
 
@@ -38,6 +49,7 @@
     public static void readFromPreferences() {
         taggingPresets.clear();
         taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false));
+        cachePresets(taggingPresets);
     }
 
     /**
@@ -53,7 +65,6 @@
         if (taggingPresets.isEmpty()) {
             Main.main.menu.presetsMenu.setVisible(false);
         } else {
-            AutoCompletionManager.cachePresets(taggingPresets);
             Map<TaggingPresetMenu, JMenu> submenus = new HashMap<>();
             for (final TaggingPreset p : taggingPresets) {
                 JMenu m = p.group != null ? submenus.get(p.group) : Main.main.menu.presetsMenu;
@@ -87,6 +98,42 @@
     }
 
     /**
+     * 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) {
+            Roles r = (Roles) item;
+            for (Role i : r.roles) {
+                if (i.key != null) {
+                    PRESET_ROLE_CACHE.add(i.key);
+                }
+            }
+        } 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)
      */
