Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 12517)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 12518)
@@ -173,5 +173,5 @@
      * Update internal ctrl, alt, shift mask from given extended modifiers mask.
      * @param modifiers event extended modifiers mask
-     * @since 12516
+     * @since 12517
      */
     protected void updateKeyModifiersEx(int modifiers) {
Index: /trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 12517)
+++ /trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 12518)
@@ -20,4 +20,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.ListenerList;
 
 /**
@@ -37,5 +38,6 @@
     @Deprecated
     private final List<ModifierListener> modifierListeners = new CopyOnWriteArrayList<>();
-    private final List<ModifierExListener> modifierExListeners = new CopyOnWriteArrayList<>();
+    private final ListenerList<ModifierExListener> modifierExListeners = ListenerList.create();
+    @Deprecated
     private int previousModifiers;
     private int previousModifiersEx;
@@ -64,8 +66,8 @@
      * Adds an object that wants to receive extended key modifier changed events.
      * @param l listener to add
-     * @since 12516
+     * @since 12517
      */
     public void addModifierExListener(ModifierExListener l) {
-        modifierExListeners.add(l);
+        modifierExListeners.addListener(l);
     }
 
@@ -91,8 +93,8 @@
      * Removes the extended key modifier listener.
      * @param l listener to remove
-     * @since 12516
+     * @since 12517
      */
     public void removeModifierExListener(ModifierExListener l) {
-        modifierExListeners.remove(l);
+        modifierExListeners.removeListener(l);
     }
 
@@ -131,5 +133,5 @@
             Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
         }
-        if (!modifierExListeners.isEmpty()) {
+        if (modifierExListeners.hasListeners()) {
             Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierExListeners.toString());
         }
@@ -195,7 +197,5 @@
         if (previousModifiersEx != modifEx) {
             previousModifiersEx = modifEx;
-            for (ModifierExListener m: modifierExListeners) {
-                m.modifiersExChanged(modifEx);
-            }
+            modifierExListeners.fireEvent(m -> m.modifiersExChanged(modifEx));
         }
 
Index: /trunk/src/org/openstreetmap/josm/gui/util/ModifierExListener.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/util/ModifierExListener.java	(revision 12517)
+++ /trunk/src/org/openstreetmap/josm/gui/util/ModifierExListener.java	(revision 12518)
@@ -4,5 +4,5 @@
 /**
  * Listener called when pressed extended modifier keys change is detected.
- * @since 12516
+ * @since 12517
  */
 @FunctionalInterface
