Index: trunk/src/org/openstreetmap/josm/actions/LassoModeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/LassoModeAction.java	(revision 15444)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.actions.mapmode.MapMode;
-import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.MapFrame;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * Lasso selection mode: select objects within a hand-drawn region.
- * @since 5152
- */
-public class LassoModeAction extends MapMode {
-
-    /**
-     * Constructs a new {@code LassoModeAction}.
-     */
-    public LassoModeAction() {
-        super(tr("Lasso Mode"),
-                /* ICON(mapmode/) */ "rope",
-                tr("Lasso selection mode: select objects within a hand-drawn region"),
-                ImageProvider.getCursor("normal", "rope"));
-    }
-
-    @Override
-    public void enterMode() {
-        if (MainApplication.isDisplayingMapView()) {
-            MapFrame map = MainApplication.getMap();
-            map.mapModeSelect.setLassoMode(true);
-            map.mapModeSelect.enterMode();
-        }
-        super.enterMode();
-    }
-
-    @Override
-    public void exitMode() {
-        if (MainApplication.isDisplayingMapView()) {
-            MapFrame map = MainApplication.getMap();
-            map.mapModeSelect.setLassoMode(false);
-            map.mapModeSelect.exitMode();
-        }
-        super.exitMode();
-    }
-
-    @Override
-    public boolean layerIsSupported(Layer l) {
-        return MainApplication.getMap().mapModeSelect.layerIsSupported(l);
-    }
-}
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectLassoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectLassoAction.java	(revision 15445)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectLassoAction.java	(revision 15445)
@@ -0,0 +1,55 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.mapmode;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Lasso selection mode: select objects within a hand-drawn region.
+ * @since 5152
+ */
+public class SelectLassoAction extends MapMode {
+
+    /**
+     * Constructs a new {@code SelectLassoAction}.
+     */
+    public SelectLassoAction() {
+        super(tr("Lasso Mode"),
+                /* ICON(mapmode/) */ "rope",
+                tr("Lasso selection mode: select objects within a hand-drawn region"),
+                Shortcut.registerShortcut("mapmode:lasso", tr("Mode: {0}", tr("Lasso Mode")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
+                ImageProvider.getCursor("normal", "rope"));
+    }
+
+    @Override
+    public void enterMode() {
+        if (MainApplication.isDisplayingMapView()) {
+            MapFrame map = MainApplication.getMap();
+            map.mapModeSelect.setLassoMode(true);
+            map.mapModeSelect.enterMode();
+        }
+        super.enterMode();
+    }
+
+    @Override
+    public void exitMode() {
+        if (MainApplication.isDisplayingMapView()) {
+            MapFrame map = MainApplication.getMap();
+            map.mapModeSelect.setLassoMode(false);
+            map.mapModeSelect.exitMode();
+        }
+        super.exitMode();
+    }
+
+    @Override
+    public boolean layerIsSupported(Layer l) {
+        return MainApplication.getMap().mapModeSelect.layerIsSupported(l);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 15444)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 15445)
@@ -344,5 +344,5 @@
      * modeMenu contains map modes
      */
-    public final JMenu modeMenu = addMenu("Mode", /* I18N: mnemonic: M */ trc("menu", "Mode"), KeyEvent.VK_M, 3, ht("/Menu/Mode"));
+    public final JMenu modeMenu = addMenu(new ModeMenu(), /* I18N: mnemonic: M */ trc("menu", "Mode"), KeyEvent.VK_M, 3, ht("/Menu/Mode"));
     /**
      * toolsMenu contains different geometry manipulation actions from JOSM core (most used)
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 15444)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 15445)
@@ -44,5 +44,4 @@
 import javax.swing.plaf.basic.BasicSplitPaneUI;
 
-import org.openstreetmap.josm.actions.LassoModeAction;
 import org.openstreetmap.josm.actions.mapmode.DeleteAction;
 import org.openstreetmap.josm.actions.mapmode.DrawAction;
@@ -52,4 +51,5 @@
 import org.openstreetmap.josm.actions.mapmode.ParallelWayAction;
 import org.openstreetmap.josm.actions.mapmode.SelectAction;
+import org.openstreetmap.josm.actions.mapmode.SelectLassoAction;
 import org.openstreetmap.josm.actions.mapmode.ZoomAction;
 import org.openstreetmap.josm.data.ViewportData;
@@ -176,5 +176,5 @@
     public final DeleteAction mapModeDelete;
     /** Select Lasso mode */
-    public LassoModeAction mapModeSelectLasso;
+    public final SelectLassoAction mapModeSelectLasso;
 
     private final transient Map<Layer, MapMode> lastMapMode = new HashMap<>();
@@ -241,5 +241,5 @@
         // toolBarActions, map mode buttons
         mapModeSelect = new SelectAction(this);
-        mapModeSelectLasso = new LassoModeAction();
+        mapModeSelectLasso = new SelectLassoAction();
         mapModeDraw = new DrawAction();
         mapModeZoom = new ZoomAction(this);
@@ -439,5 +439,5 @@
         if (!(b.getAction() instanceof MapMode))
             throw new IllegalArgumentException("MapMode action must be subclass of MapMode");
-        MainApplication.getMenu().modeMenu.add(new JCheckBoxMenuItem(b.getAction()));
+        MainMenu.add(MainApplication.getMenu().modeMenu, (MapMode) b.getAction());
         allMapModeButtons.add(b);
         toolBarActionsGroup.add(b);
Index: trunk/src/org/openstreetmap/josm/gui/ModeMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ModeMenu.java	(revision 15445)
+++ trunk/src/org/openstreetmap/josm/gui/ModeMenu.java	(revision 15445)
@@ -0,0 +1,44 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.beans.PropertyChangeListener;
+
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+
+/**
+ * Mode menu. Unlike traditional menus, default menu item is based on {@link JCheckBoxMenuItem}.
+ * @since 15445
+ */
+public class ModeMenu extends JMenu {
+
+    /**
+     * Constructs a new {@code ModeMenu}.
+     */
+    public ModeMenu() {
+        /* I18N: mnemonic: M */
+        super(trc("menu", "Mode"));
+    }
+
+    @Override
+    protected JMenuItem createActionComponent(Action a) {
+        JCheckBoxMenuItem mi = new JCheckBoxMenuItem() {
+            @Override
+            protected PropertyChangeListener createActionPropertyChangeListener(Action a) {
+                PropertyChangeListener pcl = createActionChangeListener(this);
+                if (pcl == null) {
+                    pcl = super.createActionPropertyChangeListener(a);
+                }
+                return pcl;
+            }
+        };
+        mi.setHorizontalTextPosition(JButton.TRAILING);
+        mi.setVerticalTextPosition(JButton.CENTER);
+        return mi;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 15444)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 15445)
@@ -36,6 +36,6 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.actions.LassoModeAction;
 import org.openstreetmap.josm.actions.RenameLayerAction;
+import org.openstreetmap.josm.actions.mapmode.SelectLassoAction;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.actions.mapmode.SelectAction;
@@ -787,5 +787,5 @@
     /**
      * Determines if the functionality of this layer is available in
-     * the specified map mode. {@link SelectAction} and {@link LassoModeAction} are supported by default,
+     * the specified map mode. {@link SelectAction} and {@link SelectLassoAction} are supported by default,
      * other map modes can be registered.
      * @param mapMode Map mode to be checked
@@ -794,5 +794,5 @@
      */
     private static boolean isSupportedMapMode(MapMode mapMode) {
-        if (mapMode instanceof SelectAction || mapMode instanceof LassoModeAction) {
+        if (mapMode instanceof SelectAction || mapMode instanceof SelectLassoAction) {
             return true;
         }
