Index: /trunk/src/org/openstreetmap/josm/tools/Shortcut.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 11169)
+++ /trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 11170)
@@ -7,4 +7,5 @@
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -13,4 +14,5 @@
 import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -270,5 +272,15 @@
 
     // here we store our shortcuts
-    private static List<Shortcut> shortcuts = new CopyOnWriteArrayList<>();
+    private static Collection<Shortcut> shortcuts = new CopyOnWriteArrayList<Shortcut>() {
+        @Override
+        public boolean add(Shortcut shortcut) {
+            // expensive consistency check only in debug mode
+            if (Main.isDebugEnabled()
+                    && stream().map(Shortcut::getShortText).anyMatch(shortcut.getShortText()::equals)) {
+                Main.warn(new AssertionError(shortcut.getShortText() + " already added"));
+            }
+            return super.add(shortcut);
+        }
+    };
 
     // and here our modifier groups
@@ -289,10 +301,9 @@
 
     private static Optional<Shortcut> findShortcutByKeyOrShortText(int requestedKey, int modifier, String shortText) {
-        if (modifier == getGroupModifier(NONE))
-            return Optional.empty();
+        final Predicate<Shortcut> sameKey = sc -> modifier != getGroupModifier(NONE) && sc.isSame(requestedKey, modifier);
+        final Predicate<Shortcut> sameShortText = sc -> sc.getShortText().equals(shortText);
         return shortcuts.stream()
-                .filter(sc -> sc.isSame(requestedKey, modifier) || (shortText != null && shortText.equals(sc.getShortText())))
+                .filter(sameKey.or(sameShortText))
                 .findAny();
-
     }
 
@@ -401,9 +412,7 @@
     // shutdown handling
     public static boolean savePrefs() {
-        boolean changed = false;
-        for (Shortcut sc : shortcuts) {
-            changed = changed | sc.save();
-        }
-        return changed;
+        return shortcuts.stream()
+                .map(Shortcut::save)
+                .reduce(false, Boolean::logicalOr); // has changed
     }
 
@@ -510,5 +519,5 @@
             shortText, conflict.getShortText(), newsc.getKeyText()));
         newsc.saveDefault();
-        shortcuts.replaceAll(sc -> shortText.equals(sc.getShortText()) ? newsc : sc);
+        shortcuts.add(newsc);
         return newsc;
     }
