Index: src/org/openstreetmap/josm/gui/tagging/ac/AutoCompComboBoxModel.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/ac/AutoCompComboBoxModel.java	(revision 19444)
+++ src/org/openstreetmap/josm/gui/tagging/ac/AutoCompComboBoxModel.java	(working copy)
@@ -75,4 +75,8 @@
                            comparator.compare(x, y))
             .orElse(null);
     }
+
+    public Comparator<E> getComparator() {
+        return comparator;
+    }
 }
Index: src/org/openstreetmap/josm/gui/tagging/ac/AutoCompTextField.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/ac/AutoCompTextField.java	(revision 19444)
+++ src/org/openstreetmap/josm/gui/tagging/ac/AutoCompTextField.java	(working copy)
@@ -7,6 +7,7 @@
 import java.awt.datatransfer.Transferable;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
+import java.util.Comparator;
 import java.util.EventObject;
 import java.util.regex.Pattern;
 
@@ -146,17 +147,23 @@
      * list selection.
      *
      * @param oldText the text before the last keypress was processed
+     * @param shortest if true, use only oldText
      */
-    private void autocomplete(String oldText) {
-        String newText = getText();
-        if (getSelectionEnd() != newText.length())
-            // selection not at the end
-            return;
-        // if the user typed some control character (eg. Alt+A) the selection may still be there
-        String unSelected = newText.substring(0, getSelectionStart());
-        if (unSelected.length() <= oldText.length())
-            // do not autocomplete on control or deleted chars
-            return;
+    private void autocomplete(String oldText, boolean shortest) {
+        final String newText;
+        if (shortest) {
+            newText = oldText;
+        } else {
+            newText = getText();
+            if (getSelectionEnd() != newText.length())
+                // selection not at the end
+                return;
+            // if the user typed some control character (eg. Alt+A) the selection may still be there
+            String unSelected = newText.substring(0, getSelectionStart());
+            if (unSelected.length() <= oldText.length())
+                // do not autocomplete on control or deleted chars
+                return;
+        }
         if (getInputMethodRequests().getCommittedTextLength() != getDocument().getLength()) {
             // do not autocomplete if there is uncommitted text (breaks Microsoft Japanese IME, see #21507)
             return;
@@ -180,6 +187,24 @@
     }
 
     /**
+     * Autocompletes what the user typed in.
+     * <p>
+     * Gets the user input from the editor, finds the best matching item in the model, sets the
+     * editor text to it, and highlights the autocompleted part. If there is no matching item, removes the
+     * list selection.
+     *
+     * @param oldText the text before the last keypress was processed
+     */
+    private void autocompleteToShortestMatch(String oldText) {
+        AutoCompComboBoxModel<E> model = getModel();
+        Comparator<E> oldComparator = model.getComparator();
+        model.setComparator(Comparator.comparing(E::toString));
+        autocomplete(oldText, true);
+        model.setComparator(oldComparator);
+
+    }
+
+    /**
      * Copies a String to the UNIX system-wide selection (aka middle-click).
      *
      * @param s the string to copy
@@ -266,13 +291,18 @@
         if (autocompleteEnabled && getSelectionEnd() == getText().length()) {
             final String oldText = getText().substring(0, getSelectionStart());
             // We got the event before the editor component could see it. Let the editor do its job first.
-            SwingUtilities.invokeLater(() -> autocomplete(oldText));
+            SwingUtilities.invokeLater(() -> autocomplete(oldText, false));
         }
     }
 
     @Override
     public void keyPressed(KeyEvent e) {
-        // not interested
+        if (autocompleteEnabled && e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK
+                && e.getKeyCode() == KeyEvent.VK_LESS) {
+            final String oldText = getText().substring(0, getSelectionStart());
+            // We got the event before the editor component could see it. Let the editor do its job first.
+            SwingUtilities.invokeLater(() -> autocompleteToShortestMatch(oldText));
+        }
     }
 
     @Override
