Index: src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(working copy)
@@ -29,6 +29,7 @@
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.stream.Collectors;
 
 import javax.swing.AbstractAction;
@@ -58,6 +59,7 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
 import org.openstreetmap.josm.data.validation.tests.RelationChecker;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -98,8 +100,9 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.tagging.TagEditorModel;
 import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompEvent;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompListener;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
@@ -117,7 +120,7 @@
  * This dialog is for editing relations.
  * @since 343
  */
-public class GenericRelationEditor extends RelationEditor implements CommandQueueListener {
+public class GenericRelationEditor extends RelationEditor implements AutoCompListener, CommandQueueListener {
     /** the tag table and its model */
     private final TagEditorPanel tagEditorPanel;
     private final ReferringRelationsBrowser referrerBrowser;
@@ -131,7 +134,8 @@
     private final SelectionTable selectionTable;
     private final SelectionTableModel selectionTableModel;
 
-    private final AutoCompletingTextField tfRole;
+    private final AutoCompletionManager manager;
+    private final AutoCompTextField<AutoCompletionItem> tfRole;
 
     /**
      * the menu item in the windows menu. Required to properly hide on dialog close.
@@ -216,8 +220,10 @@
         populateModels(relation);
         tagEditorPanel.getModel().ensureOneTag();
 
+        manager = AutoCompletionManager.of(this.getLayer().data);
+
         // setting up the member table
-        memberTable = new MemberTable(getLayer(), getRelation(), memberTableModel);
+        memberTable = new MemberTable(getLayer(), this, memberTableModel);
         memberTable.addMouseListener(new MemberTableDblClickAdapter());
         memberTableModel.addMemberModelListener(memberTable);
 
@@ -226,7 +232,8 @@
         selectionTable.setRowHeight(ce.getEditor().getPreferredSize().height);
 
         LeftButtonToolbar leftButtonToolbar = new LeftButtonToolbar(new RelationEditorActionAccess());
-        tfRole = buildRoleTextField(this);
+        tfRole = buildRoleTextField();
+        tfRole.addAutoCompListener(this);
 
         JSplitPane pane = buildSplitPane(
                 buildTagEditorPanel(tagEditorPanel),
@@ -446,12 +453,11 @@
     }
 
     /**
-     * builds the role text field
-     * @param re relation editor
+     * builds a role text field
      * @return the role text field
      */
-    protected static AutoCompletingTextField buildRoleTextField(final IRelationEditor re) {
-        final AutoCompletingTextField tfRole = new AutoCompletingTextField(10);
+    protected static AutoCompTextField<AutoCompletionItem> buildRoleTextField() {
+        final AutoCompTextField<AutoCompletionItem> tfRole = new AutoCompTextField<>(10);
         tfRole.setToolTipText(tr("Enter a role and apply it to the selected relation members"));
         tfRole.addFocusListener(new FocusAdapter() {
             @Override
@@ -459,19 +465,6 @@
                 tfRole.selectAll();
             }
         });
-        tfRole.setAutoCompletionList(new AutoCompletionList());
-        tfRole.addFocusListener(
-                new FocusAdapter() {
-                    @Override
-                    public void focusGained(FocusEvent e) {
-                        AutoCompletionList list = tfRole.getAutoCompletionList();
-                        if (list != null) {
-                            list.clear();
-                            AutoCompletionManager.of(re.getLayer().data).populateWithMemberRoles(list, re.getRelation());
-                        }
-                    }
-                }
-        );
         tfRole.setText(Config.getPref().get("relation.editor.generic.lastrole", ""));
         return tfRole;
     }
@@ -1039,10 +1032,9 @@
         }
 
         @Override
-        public AutoCompletingTextField getTextFieldRole() {
+        public AutoCompTextField<AutoCompletionItem> getTextFieldRole() {
             return tfRole;
         }
-
     }
 
     @Override
@@ -1054,4 +1046,23 @@
             applyAction.updateEnabledState();
         }
     }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void autoCompBefore(AutoCompEvent e) {
+        AutoCompTextField<AutoCompletionItem> tf = (AutoCompTextField<AutoCompletionItem>) e.getSource();
+        Set<String> currentRoles = new TreeSet<>();
+        for (int i = 0; i < memberTableModel.getRowCount(); ++i) {
+            String role = memberTableModel.getValue(i).getRole();
+            if (!role.isEmpty())
+                currentRoles.add(role);
+        }
+        tf.getModel().removeAllElements();
+        tf.getModel().addAllElements(manager.getRolesForRelation(currentRoles, tagEditorPanel.getModel().getTags()));
+    }
+
+    @Override
+    public void autoCompPerformed(AutoCompEvent e) {
+        // Not interested
+    }
 }
Index: src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java	(working copy)
@@ -9,45 +9,32 @@
 import javax.swing.JTable;
 import javax.swing.table.TableCellEditor;
 
-import org.openstreetmap.josm.data.osm.Relation;
-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.data.tagging.ac.AutoCompletionItem;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompListener;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField;
 
 /**
  * The {@link CellEditor} for the role cell in the table. Supports autocompletion.
  */
 public class MemberRoleCellEditor extends AbstractCellEditor implements TableCellEditor {
-    private final AutoCompletingTextField editor;
-    private final AutoCompletionManager autoCompletionManager;
-    private final transient Relation relation;
+    private final AutoCompTextField<AutoCompletionItem> editor;
 
-    /** user input is matched against this list of auto completion items */
-    private final AutoCompletionList autoCompletionList;
-
     /**
      * Constructs a new {@code MemberRoleCellEditor}.
-     * @param autoCompletionManager the auto completion manager. Must not be null
-     * @param relation the relation. Can be null
+     * @param listener the autocompletion listener
      * @since 13675
      */
-    public MemberRoleCellEditor(AutoCompletionManager autoCompletionManager, Relation relation) {
-        this.autoCompletionManager = autoCompletionManager;
-        this.relation = relation;
-        editor = new AutoCompletingTextField(0, false);
+    public MemberRoleCellEditor(AutoCompListener listener) {
+        editor = new AutoCompTextField<>(0, false);
         editor.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
-        autoCompletionList = new AutoCompletionList();
-        editor.setAutoCompletionList(autoCompletionList);
+        editor.addAutoCompListener(listener);
     }
 
     @Override
     public Component getTableCellEditorComponent(JTable table,
             Object value, boolean isSelected, int row, int column) {
-
         String role = (String) value;
         editor.setText(role);
-        autoCompletionList.clear();
-        autoCompletionManager.populateWithMemberRoles(autoCompletionList, relation);
         return editor;
     }
 
@@ -60,7 +47,7 @@
      * Returns the edit field for this cell editor.
      * @return the edit field for this cell editor
      */
-    public AutoCompletingTextField getEditor() {
+    public AutoCompTextField<AutoCompletionItem> getEditor() {
         return editor;
     }
 }
Index: src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(working copy)
@@ -27,7 +27,6 @@
 import org.openstreetmap.josm.actions.HistoryInfoAction;
 import org.openstreetmap.josm.actions.ZoomToAction;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -41,7 +40,7 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompListener;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -60,11 +59,11 @@
      * constructor for relation member table
      *
      * @param layer the data layer of the relation. Must not be null
-     * @param relation the relation. Can be null
+     * @param listener the autocompletion listener
      * @param model the table model
      */
-    public MemberTable(OsmDataLayer layer, Relation relation, MemberTableModel model) {
-        super(model, new MemberTableColumnModel(AutoCompletionManager.of(layer.data), relation), model.getSelectionModel());
+    public MemberTable(OsmDataLayer layer, AutoCompListener listener, MemberTableModel model) {
+        super(model, new MemberTableColumnModel(listener), model.getSelectionModel());
         setLayer(layer);
         model.addMemberModelListener(this);
 
Index: src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java	(working copy)
@@ -6,8 +6,7 @@
 import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.TableColumn;
 
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompListener;
 
 /**
  * This is the column model for the {@link MemberTable}
@@ -16,11 +15,10 @@
 
     /**
      * Constructs a new {@code MemberTableColumnModel}.
-     * @param autoCompletionManager the auto completion manager. Must not be null
-     * @param relation the relation. Can be null
+     * @param listener the autocompletion listener
      * @since 13675
      */
-    public MemberTableColumnModel(AutoCompletionManager autoCompletionManager, Relation relation) {
+    public MemberTableColumnModel(AutoCompListener listener) {
         TableColumn col;
 
         // column 0 - the member role
@@ -29,7 +27,7 @@
         col.setResizable(true);
         col.setPreferredWidth(100);
         col.setCellRenderer(new MemberTableRoleCellRenderer());
-        col.setCellEditor(new MemberRoleCellEditor(autoCompletionManager, relation));
+        col.setCellEditor(new MemberRoleCellEditor(listener));
         addColumn(col);
 
         // column 1 - the member
Index: src/org/openstreetmap/josm/gui/dialogs/relation/actions/IRelationEditorActionAccess.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/actions/IRelationEditorActionAccess.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/actions/IRelationEditorActionAccess.java	(working copy)
@@ -3,6 +3,7 @@
 
 import javax.swing.Action;
 
+import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
@@ -9,7 +10,7 @@
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTable;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
 import org.openstreetmap.josm.gui.tagging.TagEditorModel;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField;
 
 /**
  * This interface provides access to the relation editor for actions.
@@ -69,7 +70,7 @@
      * Get the text field that is used to edit the role.
      * @return The role text field.
      */
-    AutoCompletingTextField getTextFieldRole();
+    AutoCompTextField<AutoCompletionItem> getTextFieldRole();
 
     /**
      * Tells the member table editor to stop editing and accept any partially edited value as the value of the editor.
Index: src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java	(working copy)
@@ -20,6 +20,7 @@
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -27,7 +28,7 @@
 import org.openstreetmap.josm.gui.dialogs.relation.RelationDialogManager;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.tagging.TagEditorModel;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -38,7 +39,7 @@
 abstract class SavingAction extends AbstractRelationEditorAction {
     private static final long serialVersionUID = 1L;
 
-    protected final AutoCompletingTextField tfRole;
+    protected final AutoCompTextField<AutoCompletionItem> tfRole;
 
     protected SavingAction(IRelationEditorActionAccess editorAccess, IRelationEditorUpdateOn... updateOn) {
         super(editorAccess, updateOn);
Index: src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java	(working copy)
@@ -10,9 +10,10 @@
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 
+import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -23,7 +24,7 @@
 public class SetRoleAction extends AbstractRelationEditorAction implements DocumentListener {
     private static final long serialVersionUID = 1L;
 
-    private final transient AutoCompletingTextField tfRole;
+    private final transient AutoCompTextField<AutoCompletionItem> tfRole;
 
     /**
      * Constructs a new {@code SetRoleAction}.
Index: src/org/openstreetmap/josm/gui/tagging/ac/AutoCompComboBox.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/ac/AutoCompComboBox.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/tagging/ac/AutoCompComboBox.java	(working copy)
@@ -104,8 +104,8 @@
      * @param elems The string items to set
      * @deprecated Has been moved to the model, where it belongs. Use
      *     {@link org.openstreetmap.josm.gui.widgets.HistoryComboBoxModel#addAllStrings} instead. Probably you want to use
-     *     {@link org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel.Preferences#load} and
-     *     {@link org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel.Preferences#save}.
+     *     {@link org.openstreetmap.josm.gui.widgets.JosmComboBoxModel.Preferences#load} and
+     *     {@link org.openstreetmap.josm.gui.widgets.JosmComboBoxModel.Preferences#save}.
      */
     @Deprecated
     public void setPossibleItems(Collection<E> elems) {
@@ -122,8 +122,8 @@
      * @since 15011
      * @deprecated Has been moved to the model, where it belongs. Use
      *     {@link org.openstreetmap.josm.gui.widgets.HistoryComboBoxModel#addAllStrings} instead. Probably you want to use
-     *     {@link org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel.Preferences#load} and
-     *     {@link org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel.Preferences#save}.
+     *     {@link org.openstreetmap.josm.gui.widgets.JosmComboBoxModel.Preferences#load} and
+     *     {@link org.openstreetmap.josm.gui.widgets.JosmComboBoxModel.Preferences#save}.
      */
     @Deprecated
     public void setPossibleItemsTopDown(Collection<E> elems) {
Index: src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java	(working copy)
@@ -132,7 +132,7 @@
      * only accessed by getRoleCache(), rebuild() and cacheRelationMemberRoles()
      * use getRoleCache() accessor
      */
-    protected Set<String> roleCache;
+    protected final MultiMap<String, String> ROLE_CACHE = new MultiMap<>();
 
     /**
      * the same as roleCache but for the preset roles can be accessed directly
@@ -159,12 +159,12 @@
         return tagCache;
     }
 
-    protected Set<String> getRoleCache() {
+    protected MultiMap<String, String> getRoleCache() {
         if (dirty) {
             rebuild();
             dirty = false;
         }
-        return roleCache;
+        return ROLE_CACHE;
     }
 
     /**
@@ -172,7 +172,7 @@
      */
     protected void rebuild() {
         tagCache = new MultiMap<>();
-        roleCache = new HashSet<>();
+        ROLE_CACHE.clear();
         cachePrimitives(ds.allNonDeletedCompletePrimitives());
     }
 
@@ -201,9 +201,10 @@
      * @param relation the relation
      */
     protected void cacheRelationMemberRoles(Relation relation) {
+        String type = relation.get("type");
         for (RelationMember m: relation.getMembers()) {
-            if (m.hasRole()) {
-                roleCache.add(m.getRole());
+            if (type != null && m.hasRole()) {
+                ROLE_CACHE.put(type, m.getRole());
             }
         }
     }
@@ -264,7 +265,7 @@
      * @return the list of member roles
      */
     public List<String> getMemberRoles() {
-        return new ArrayList<>(getRoleCache());
+        return new ArrayList<>(getRoleCache().getAllValues());
     }
 
     /**
@@ -274,7 +275,7 @@
      */
     public void populateWithMemberRoles(AutoCompletionList list) {
         list.add(TaggingPresets.getPresetRoles(), AutoCompletionPriority.IS_IN_STANDARD);
-        list.add(getRoleCache(), AutoCompletionPriority.IS_IN_DATASET);
+        list.add(getRoleCache().getAllValues(), AutoCompletionPriority.IS_IN_DATASET);
     }
 
     /**
@@ -303,6 +304,50 @@
     }
 
     /**
+     * Returns all cached roles for given relation as {@link AutoCompletionItem}s.
+     *
+     * @param roles current roles in the member editor panel
+     * @param keys current keys in the tag editor panel
+     * @return the currently cached items, sorted by priority and alphabet
+     * @since xxx
+     */
+    public List<AutoCompletionItem> getRolesForRelation(Set<String> roles, Map<String, String> keys) {
+        Map<String, AutoCompletionPriority> map = new HashMap<>();
+
+        // the roles on this relation
+        for (String role : roles) {
+            map.merge(role, AutoCompletionPriority.IS_IN_DATASET, AutoCompletionPriority::mergeWith);
+        }
+        // the roles on existing relations of the same type
+        String type = keys.get("type");
+        if (type != null) {
+            for (String role : getRoleCache().getValues(type)) {
+                map.merge(role, AutoCompletionPriority.IS_IN_DATASET, AutoCompletionPriority::mergeWith);
+            }
+        }
+        Collection<TaggingPreset> presets = TaggingPresets.getMatchingPresets(null, keys, false);
+        if (presets.isEmpty()) {
+            // no preset matched, all roles of all presets
+            for (String role : TaggingPresets.getPresetRoles()) {
+                map.merge(role, AutoCompletionPriority.IS_IN_STANDARD, AutoCompletionPriority::mergeWith);
+            }
+            for (String role : getRoleCache().getAllValues()) {
+                map.merge(role, AutoCompletionPriority.IS_IN_DATASET, AutoCompletionPriority::mergeWith);
+            }
+        } else {
+            // all roles of all matched presets
+            for (TaggingPreset preset : presets) {
+                if (preset.roles != null) {
+                    for (Role role : preset.roles.roles) {
+                        map.merge(role.key, AutoCompletionPriority.IS_IN_STANDARD, AutoCompletionPriority::mergeWith);
+                    }
+                }
+            }
+        }
+        return map.entrySet().stream().map(e -> new AutoCompletionItem(e.getKey(), e.getValue())).sorted().collect(Collectors.toList());
+    }
+
+    /**
      * Populates the an {@link AutoCompletionList} with the currently cached tag keys
      *
      * @param list the list to populate
@@ -503,7 +548,7 @@
                     MainApplication.getLayerManager().removeLayerChangeListener(this);
                     dirty = true;
                     tagCache = null;
-                    roleCache = null;
+                    ROLE_CACHE.clear();
                     ds = null;
                 }
             }
Index: src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
===================================================================
--- src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java	(revision 18270)
+++ src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java	(working copy)
@@ -39,8 +39,8 @@
      * @return the items as strings
      * @deprecated Has been moved to the model, where it belongs. Use
      *     {@link HistoryComboBoxModel#asStringList} instead. Probably you want to use
-     *     {@link org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel.Preferences#load} and
-     *     {@link org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel.Preferences#save}.
+     *     {@link org.openstreetmap.josm.gui.widgets.JosmComboBoxModel.Preferences#load} and
+     *     {@link org.openstreetmap.josm.gui.widgets.JosmComboBoxModel.Preferences#save}.
      */
     @Deprecated
     public List<String> getHistory() {
Index: src/org/openstreetmap/josm/tools/MultiMap.java
===================================================================
--- src/org/openstreetmap/josm/tools/MultiMap.java	(revision 18270)
+++ src/org/openstreetmap/josm/tools/MultiMap.java	(working copy)
@@ -124,6 +124,14 @@
     }
 
     /**
+     * Like getValues, but returns all values for all keys.
+     * @return the set of all values or an empty set
+     */
+    public Set<B> getAllValues() {
+        return map.entrySet().stream().flatMap(e -> e.getValue().stream()).collect(Collectors.toSet());
+    }
+
+    /**
      * Returns {@code true} if this map contains no key-value mappings.
      * @return {@code true} if this map contains no key-value mappings
      * @see Map#isEmpty()
Index: test/unit/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditorTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditorTest.java	(revision 18270)
+++ test/unit/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditorTest.java	(working copy)
@@ -18,9 +18,10 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.testutils.mockers.JOptionPaneSimpleMocker;
 
@@ -123,7 +124,7 @@
         OsmDataLayer layer = new OsmDataLayer(ds, "test", null);
         IRelationEditor re = newRelationEditor(relation, layer);
 
-        AutoCompletingTextField tfRole = GenericRelationEditor.buildRoleTextField(re);
+        AutoCompTextField<AutoCompletionItem> tfRole = GenericRelationEditor.buildRoleTextField();
         assertNotNull(tfRole);
 
         TagEditorPanel tagEditorPanel = new TagEditorPanel(relation, null);
