Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 12517)
@@ -26,5 +26,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -45,5 +45,5 @@
  * @author imi
  */
-public class DeleteAction extends MapMode implements ModifierListener {
+public class DeleteAction extends MapMode implements ModifierExListener {
     // Cache previous mouse event (needed when only the modifier keys are pressed but the mouse isn't moved)
     private MouseEvent oldEvent;
@@ -113,5 +113,5 @@
         Main.map.mapView.addMouseMotionListener(this);
         // This is required to update the cursors when ctrl/shift/alt is pressed
-        Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addModifierExListener(this);
     }
 
@@ -121,5 +121,5 @@
         Main.map.mapView.removeMouseListener(this);
         Main.map.mapView.removeMouseMotionListener(this);
-        Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeModifierExListener(this);
         removeHighlighting();
     }
@@ -188,5 +188,5 @@
      * segments for the given pointer position (via MouseEvent) and modifiers.
      * @param e current mouse event
-     * @param modifiers mouse modifiers, not necessarly taken from the given mouse event
+     * @param modifiers extended mouse modifiers, not necessarly taken from the given mouse event
      */
     private void addHighlighting(MouseEvent e, int modifiers) {
@@ -242,5 +242,5 @@
      *
      * @param e current mouse event
-     * @param modifiers mouse modifiers, not necessarly taken from the given mouse event
+     * @param modifiers extended mouse modifiers, not necessarly taken from the given mouse event
      */
     private void updateCursor(MouseEvent e, int modifiers) {
@@ -278,5 +278,5 @@
      */
     private void giveUserFeedback(MouseEvent e) {
-        giveUserFeedback(e, e.getModifiers());
+        giveUserFeedback(e, e.getModifiersEx());
     }
 
@@ -359,5 +359,5 @@
 
     private DeleteParameters getDeleteParameters(MouseEvent e, int modifiers) {
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
 
         DeleteParameters result = new DeleteParameters();
@@ -419,5 +419,5 @@
      */
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         if (oldEvent == null)
             return;
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 12517)
@@ -63,5 +63,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -73,5 +73,5 @@
  * Mapmode to add nodes, create and extend ways.
  */
-public class DrawAction extends MapMode implements MapViewPaintable, DataSelectionListener, KeyPressReleaseListener, ModifierListener {
+public class DrawAction extends MapMode implements MapViewPaintable, DataSelectionListener, KeyPressReleaseListener, ModifierExListener {
 
     /**
@@ -279,5 +279,5 @@
 
         Main.map.keyDetector.addKeyListener(this);
-        Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addModifierExListener(this);
         ignoreNextKeyRelease = true;
     }
@@ -299,5 +299,5 @@
         removeHighlighting();
         Main.map.keyDetector.removeKeyListener(this);
-        Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeModifierExListener(this);
     }
 
@@ -306,8 +306,8 @@
      */
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         if (!Main.isDisplayingMapView() || !Main.map.mapView.isActiveLayerDrawable())
             return;
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
         computeHelperLine();
         addHighlighting();
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 12517)
@@ -54,5 +54,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -62,5 +62,5 @@
  * Makes a rectangle from a line, or modifies a rectangle.
  */
-public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPressReleaseListener, ModifierListener {
+public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPressReleaseListener, ModifierExListener {
 
     enum Mode { extrude, translate, select, create_new, translate_node }
@@ -296,5 +296,5 @@
         ignoreNextKeyRelease = true;
         Main.map.keyDetector.addKeyListener(this);
-        Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addModifierExListener(this);
     }
 
@@ -325,5 +325,5 @@
         dualAlignCheckboxMenuItem.getAction().setEnabled(false);
         Main.map.keyDetector.removeKeyListener(this);
-        Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeModifierExListener(this);
         super.exitMode();
     }
@@ -337,8 +337,8 @@
      */
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         if (!Main.isDisplayingMapView() || !Main.map.mapView.isActiveLayerDrawable())
             return;
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
         if (mode == Mode.select) {
             Main.map.mapView.setNewCursor(ctrl ? cursorTranslate : alt ? cursorCreateNew : shift ? cursorCreateNodes : cursor, this);
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 12517)
@@ -46,5 +46,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Pair;
@@ -55,5 +55,5 @@
  */
 public class ImproveWayAccuracyAction extends MapMode implements
-        SelectionChangedListener, ModifierListener {
+        SelectionChangedListener, ModifierExListener {
 
     private static final String CROSSHAIR = "crosshair";
@@ -150,5 +150,5 @@
         DataSet.addSelectionListener(this);
 
-        Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addModifierExListener(this);
     }
 
@@ -167,5 +167,5 @@
         DataSet.removeSelectionListener(this);
 
-        Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeModifierExListener(this);
         temporaryLayer.invalidate();
     }
@@ -344,9 +344,9 @@
     // -------------------------------------------------------------------------
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         if (!Main.isDisplayingMapView() || !Main.map.mapView.isActiveLayerDrawable()) {
             return;
         }
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
         updateCursorDependentObjectsIfNeeded();
         updateCursor();
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 12517)
@@ -151,15 +151,32 @@
 
     protected void updateKeyModifiers(InputEvent e) {
-        updateKeyModifiers(e.getModifiers());
+        updateKeyModifiersEx(e.getModifiersEx());
     }
 
     protected void updateKeyModifiers(MouseEvent e) {
-        updateKeyModifiers(e.getModifiers());
-    }
-
+        updateKeyModifiersEx(e.getModifiersEx());
+    }
+
+    /**
+     * Update internal ctrl, alt, shift mask from given modifiers mask.
+     * @param modifiers event modifiers mask
+     * @deprecated use {@link #updateKeyModifiersEx} instead
+     */
+    @Deprecated
     protected void updateKeyModifiers(int modifiers) {
         ctrl = (modifiers & ActionEvent.CTRL_MASK) != 0;
         alt = (modifiers & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0;
         shift = (modifiers & ActionEvent.SHIFT_MASK) != 0;
+    }
+
+    /**
+     * Update internal ctrl, alt, shift mask from given extended modifiers mask.
+     * @param modifiers event extended modifiers mask
+     * @since 12516
+     */
+    protected void updateKeyModifiersEx(int modifiers) {
+        ctrl = (modifiers & InputEvent.CTRL_DOWN_MASK) != 0;
+        alt = (modifiers & (InputEvent.ALT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK)) != 0;
+        shift = (modifiers & InputEvent.SHIFT_DOWN_MASK) != 0;
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 12517)
@@ -47,5 +47,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Geometry;
@@ -90,5 +90,5 @@
  * @author Ole Jørgen Brønner (olejorgenb)
  */
-public class ParallelWayAction extends MapMode implements ModifierListener {
+public class ParallelWayAction extends MapMode implements ModifierExListener {
 
     private static final CachingProperty<BasicStroke> HELPER_LINE_STROKE = new StrokeProperty(prefKey("stroke.hepler-line"), "1").cached();
@@ -173,5 +173,5 @@
 
         //// Needed to update the mouse cursor if modifiers are changed when the mouse is motionless
-        Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addModifierExListener(this);
         sourceWays = new LinkedHashSet<>(getLayerManager().getEditDataSet().getSelectedWays());
         for (Way w : sourceWays) {
@@ -188,5 +188,5 @@
         Main.map.statusLine.setDist(-1);
         Main.map.statusLine.repaint();
-        Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeModifierExListener(this);
         removeWayHighlighting(sourceWays);
         pWays = null;
@@ -216,5 +216,5 @@
 
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         if (Main.map == null || mv == null || !mv.isActiveLayerDrawable())
             return;
@@ -229,5 +229,5 @@
     private boolean updateModifiersState(int modifiers) {
         boolean oldAlt = alt, oldShift = shift, oldCtrl = ctrl;
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
         return oldAlt != alt || oldShift != shift || oldCtrl != ctrl;
     }
@@ -275,5 +275,5 @@
     public void mousePressed(MouseEvent e) {
         requestFocusInMapView();
-        updateModifiersState(e.getModifiers());
+        updateModifiersState(e.getModifiersEx());
         // Other buttons are off limit, but we still get events.
         if (e.getButton() != MouseEvent.BUTTON1)
@@ -300,5 +300,5 @@
     @Override
     public void mouseReleased(MouseEvent e) {
-        updateModifiersState(e.getModifiers());
+        updateModifiersState(e.getModifiersEx());
         // Other buttons are off limit, but we still get events.
         if (e.getButton() != MouseEvent.BUTTON1)
@@ -355,5 +355,5 @@
             return;
 
-        boolean modifiersChanged = updateModifiersState(e.getModifiers());
+        boolean modifiersChanged = updateModifiersState(e.getModifiersEx());
         updateFlagsChangeableAlways();
 
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 12516)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 12517)
@@ -49,5 +49,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Pair;
@@ -66,5 +66,5 @@
  * feature "selection remove" is disabled on this platform.
  */
-public class SelectAction extends MapMode implements ModifierListener, KeyPressReleaseListener, SelectionEnded {
+public class SelectAction extends MapMode implements ModifierExListener, KeyPressReleaseListener, SelectionEnded {
 
     private static final String NORMAL = "normal";
@@ -208,5 +208,5 @@
         virtualManager.init();
         // This is required to update the cursors when ctrl/shift/alt is pressed
-        Main.map.keyDetector.addModifierListener(this);
+        Main.map.keyDetector.addModifierExListener(this);
         Main.map.keyDetector.addKeyListener(this);
     }
@@ -219,5 +219,5 @@
         mv.removeMouseMotionListener(this);
         mv.setVirtualNodesEnabled(false);
-        Main.map.keyDetector.removeModifierListener(this);
+        Main.map.keyDetector.removeModifierExListener(this);
         Main.map.keyDetector.removeKeyListener(this);
         removeHighlighting();
@@ -225,5 +225,5 @@
 
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         if (!Main.isDisplayingMapView() || oldEvent == null) return;
         if (giveUserFeedback(oldEvent, modifiers)) {
@@ -239,5 +239,5 @@
      */
     private boolean giveUserFeedback(MouseEvent e) {
-        return giveUserFeedback(e, e.getModifiers());
+        return giveUserFeedback(e, e.getModifiersEx());
     }
 
@@ -246,5 +246,5 @@
      * Please note that the highlighting for merging while moving is handled via mouseDragged.
      * @param e {@code MouseEvent} which should be used as base for the feedback
-     * @param modifiers define custom keyboard modifiers if the ones from MouseEvent are outdated or similar
+     * @param modifiers define custom keyboard extended modifiers if the ones from MouseEvent are outdated or similar
      * @return {@code true} if repaint is required
      */
@@ -253,5 +253,5 @@
                 mv.getNearestNodeOrWay(e.getPoint(), mv.isSelectablePredicate, true));
 
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
         determineMapMode(!c.isEmpty());
 
Index: /trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 12516)
+++ /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 12516)
+++ /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 {
