Index: trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 12304)
+++ trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 12517)
@@ -35,6 +35,9 @@
 
     private final List<KeyPressReleaseListener> keyListeners = new CopyOnWriteArrayList<>();
+    @Deprecated
     private final List<ModifierListener> modifierListeners = new CopyOnWriteArrayList<>();
+    private final List<ModifierExListener> modifierExListeners = new CopyOnWriteArrayList<>();
     private int previousModifiers;
+    private int previousModifiersEx;
 
     private boolean enabled = true;
@@ -51,5 +54,7 @@
      * Adds an object that wants to receive key modifier changed events.
      * @param l listener to add
-     */
+     * @deprecated use {@link #addModifierExListener} instead
+     */
+    @Deprecated
     public void addModifierListener(ModifierListener l) {
         modifierListeners.add(l);
@@ -57,4 +62,13 @@
 
     /**
+     * Adds an object that wants to receive extended key modifier changed events.
+     * @param l listener to add
+     * @since 12516
+     */
+    public void addModifierExListener(ModifierExListener l) {
+        modifierExListeners.add(l);
+    }
+
+    /**
      * Removes the listener.
      * @param l listener to remove
@@ -67,7 +81,18 @@
      * Removes the key modifier listener.
      * @param l listener to remove
-     */
+     * @deprecated use {@link #removeModifierExListener} instead
+     */
+    @Deprecated
     public void removeModifierListener(ModifierListener l) {
         modifierListeners.remove(l);
+    }
+
+    /**
+     * Removes the extended key modifier listener.
+     * @param l listener to remove
+     * @since 12516
+     */
+    public void removeModifierExListener(ModifierExListener l) {
+        modifierExListeners.remove(l);
     }
 
@@ -105,4 +130,7 @@
         if (!modifierListeners.isEmpty()) {
             Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
+        }
+        if (!modifierExListeners.isEmpty()) {
+            Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierExListeners.toString());
         }
         try {
@@ -147,4 +175,5 @@
 
     @Override
+    @SuppressWarnings("deprecation")
     public void eventDispatched(AWTEvent e) {
         if (!(e instanceof KeyEvent)) {
@@ -162,4 +191,13 @@
         }
 
+        // check if ctrl, alt, shift extended modifiers are changed
+        int modifEx = ke.getModifiersEx();
+        if (previousModifiersEx != modifEx) {
+            previousModifiersEx = modifEx;
+            for (ModifierExListener m: modifierExListeners) {
+                m.modifiersExChanged(modifEx);
+            }
+        }
+
         processKeyEvent(ke);
     }
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 12517)
@@ -0,0 +1,15 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+/**
+ * Listener called when pressed extended modifier keys change is detected.
+ * @since 12516
+ */
+@FunctionalInterface
+public interface ModifierExListener {
+    /**
+     * Called when the extended modifiers are changed
+     * @param modifiers The new extended modifiers
+     */
+    void modifiersExChanged(int modifiers);
+}
Index: trunk/src/org/openstreetmap/josm/gui/util/ModifierListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/ModifierListener.java	(revision 12304)
+++ trunk/src/org/openstreetmap/josm/gui/util/ModifierListener.java	(revision 12517)
@@ -6,5 +6,7 @@
  * @since 7217
  * @since 10600 (functional interface)
+ * @deprecated use ModifierExListener instead
  */
+@Deprecated
 @FunctionalInterface
 public interface ModifierListener {
