Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 12758)
@@ -334,18 +334,11 @@
 
     /**
-     * Maintains a list of used tags for autocompletion.
-     */
-    private AutoCompletionManager autocomplete;
-
-    /**
      * Returns the autocompletion manager, which maintains a list of used tags for autocompletion.
      * @return the autocompletion manager
-     */
+     * @deprecated to be removed end of 2017. Use {@link AutoCompletionManager#of(DataSet)} instead.
+     */
+    @Deprecated
     public AutoCompletionManager getAutoCompletionManager() {
-        if (autocomplete == null) {
-            autocomplete = new AutoCompletionManager(this);
-            addDataSetListener(autocomplete);
-        }
-        return autocomplete;
+        return AutoCompletionManager.of(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java	(revision 12758)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -203,5 +204,5 @@
         OsmDataLayer editLayer = MainApplication.getLayerManager().getEditLayer();
         if (editLayer != null) {
-            editLayer.data.getAutoCompletionManager().populateWithMemberRoles(acList);
+            AutoCompletionManager.of(editLayer.data).populateWithMemberRoles(acList);
         }
         tfRole.setAutoCompletionList(acList);
@@ -212,5 +213,5 @@
         AutoCompletionList acList2 = new AutoCompletionList();
         if (editLayer != null) {
-            editLayer.data.getAutoCompletionManager().populateWithKeys(acList2);
+            AutoCompletionManager.of(editLayer.data).populateWithKeys(acList2);
         }
         tfKey.setAutoCompletionList(acList2);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 12758)
@@ -446,5 +446,5 @@
             mainPanel.add(p, BorderLayout.CENTER);
 
-            AutoCompletionManager autocomplete = MainApplication.getLayerManager().getEditLayer().data.getAutoCompletionManager();
+            AutoCompletionManager autocomplete = AutoCompletionManager.of(MainApplication.getLayerManager().getEditLayer().data);
             List<AutoCompletionListItem> keyList = autocomplete.getKeys();
             keyList.sort(DEFAULT_AC_ITEM_COMPARATOR);
@@ -692,5 +692,5 @@
 
             cacheRecentTags();
-            AutoCompletionManager autocomplete = MainApplication.getLayerManager().getEditLayer().data.getAutoCompletionManager();
+            AutoCompletionManager autocomplete = AutoCompletionManager.of(MainApplication.getLayerManager().getEditLayer().data);
             List<AutoCompletionListItem> keyList = autocomplete.getKeys();
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 12758)
@@ -94,4 +94,5 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
@@ -423,5 +424,5 @@
                         if (list != null) {
                             list.clear();
-                            re.getLayer().data.getAutoCompletionManager().populateWithMemberRoles(list, re.getRelation());
+                            AutoCompletionManager.of(re.getLayer().data).populateWithMemberRoles(list, re.getRelation());
                         }
                     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java	(revision 12758)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 
 /**
@@ -47,5 +48,5 @@
         editor.setText(role);
         autoCompletionList.clear();
-        ds.getAutoCompletionManager().populateWithMemberRoles(autoCompletionList, relation);
+        AutoCompletionManager.of(ds).populateWithMemberRoles(autoCompletionList, relation);
         return editor;
     }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java	(revision 12758)
@@ -181,5 +181,5 @@
         CheckParameterUtil.ensureParameterNotNull(layer, "layer");
 
-        AutoCompletionManager autocomplete = layer.data.getAutoCompletionManager();
+        AutoCompletionManager autocomplete = AutoCompletionManager.of(layer.data);
         AutoCompletionList acList = new AutoCompletionList();
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java	(revision 12758)
@@ -6,4 +6,5 @@
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -28,4 +29,10 @@
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
@@ -129,4 +136,6 @@
     static final Set<String> PRESET_ROLE_CACHE = new HashSet<>();
 
+    private static final Map<DataSet, AutoCompletionManager> INSTANCES = new HashMap<>();
+
     /**
      * Constructs a new {@code AutoCompletionManager}.
@@ -422,3 +431,44 @@
         dirty = true;
     }
+
+    private static void registerListeners(AutoCompletionManager autoCompletionManager) {
+        autoCompletionManager.ds.addDataSetListener(autoCompletionManager);
+        MainApplication.getLayerManager().addLayerChangeListener(new LayerChangeListener() {
+            @Override
+            public void layerRemoving(LayerRemoveEvent e) {
+                if (e.getRemovedLayer() instanceof OsmDataLayer
+                        && ((OsmDataLayer) e.getRemovedLayer()).data == autoCompletionManager.ds) {
+                    INSTANCES.remove(autoCompletionManager.ds);
+                    autoCompletionManager.ds.removeDataSetListener(autoCompletionManager);
+                    MainApplication.getLayerManager().removeLayerChangeListener(this);
+                }
+            }
+
+            @Override
+            public void layerOrderChanged(LayerOrderChangeEvent e) {
+                // Do nothing
+            }
+
+            @Override
+            public void layerAdded(LayerAddEvent e) {
+                // Do nothing
+            }
+        });
+    }
+
+    /**
+     * Returns the {@code AutoCompletionManager} for the given data set.
+     * @param dataSet the data set
+     * @return the {@code AutoCompletionManager} for the given data set
+     * @since 12758
+     */
+    public static AutoCompletionManager of(DataSet dataSet) {
+        AutoCompletionManager result = INSTANCES.get(dataSet);
+        if (result == null) {
+            result = new AutoCompletionManager(dataSet);
+            INSTANCES.put(dataSet, result);
+            registerListeners(result);
+        }
+        return result;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 12757)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 12758)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
@@ -48,5 +49,5 @@
         }
         AutoCompletionList list = new AutoCompletionList();
-        layer.data.getAutoCompletionManager().populateWithTagValues(list, keys);
+        AutoCompletionManager.of(layer.data).populateWithTagValues(list, keys);
         field.setAutoCompletionList(list);
     }
