Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 15437)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 15438)
@@ -10,8 +10,12 @@
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 
 import javax.swing.JCheckBoxMenuItem;
@@ -116,4 +120,5 @@
 import org.openstreetmap.josm.actions.audio.AudioPrevAction;
 import org.openstreetmap.josm.actions.audio.AudioSlowerAction;
+import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.UndoRedoHandler;
@@ -337,8 +342,12 @@
     public final JMenu viewMenu = addMenu("View", /* I18N: mnemonic: V */ trc("menu", "View"), KeyEvent.VK_V, 2, ht("/Menu/View"));
     /**
+     * modeMenu contains map modes
+     */
+    public final JMenu modeMenu = addMenu("Mode", /* I18N: mnemonic: M */ trc("menu", "Mode"), KeyEvent.VK_M, 3, ht("/Menu/Mode"));
+    /**
      * toolsMenu contains different geometry manipulation actions from JOSM core (most used)
      * The plugins should use other menus
      */
-    public final JMenu toolsMenu = addMenu("Tools", /* I18N: mnemonic: T */ trc("menu", "Tools"), KeyEvent.VK_T, 3, ht("/Menu/Tools"));
+    public final JMenu toolsMenu = addMenu("Tools", /* I18N: mnemonic: T */ trc("menu", "Tools"), KeyEvent.VK_T, 4, ht("/Menu/Tools"));
     /**
      * moreToolsMenu contains geometry-related actions from all the plugins
@@ -346,5 +355,5 @@
      */
     // CHECKSTYLE.OFF: LineLength
-    public final JMenu moreToolsMenu = addMenu("More tools", /* I18N: mnemonic: M */ trc("menu", "More tools"), KeyEvent.VK_M, 4, ht("/Menu/MoreTools"));
+    public final JMenu moreToolsMenu = addMenu("More tools", /* I18N: mnemonic: O */ trc("menu", "More tools"), KeyEvent.VK_O, 5, ht("/Menu/MoreTools"));
     /**
      * dataMenu contains plugin actions that are related to certain tagging schemes (addressing opening hours),
@@ -352,14 +361,14 @@
      * @since 6082
      */
-    public final JMenu dataMenu = addMenu("Data", /* I18N: mnemonic: D */ trc("menu", "Data"), KeyEvent.VK_D, 5, ht("/Menu/Data"));
+    public final JMenu dataMenu = addMenu("Data", /* I18N: mnemonic: D */ trc("menu", "Data"), KeyEvent.VK_D, 6, ht("/Menu/Data"));
     /**
      * selectionMenu contains all actions related to selecting different objects
      * @since 6082 (moved from Utilsplugin2)
      */
-    public final JMenu selectionMenu = addMenu("Selection", /* I18N: mnemonic: N */ trc("menu", "Selection"), KeyEvent.VK_N, 6, ht("/Menu/Selection"));
+    public final JMenu selectionMenu = addMenu("Selection", /* I18N: mnemonic: N */ trc("menu", "Selection"), KeyEvent.VK_N, 7, ht("/Menu/Selection"));
     /**
      * presetsMenu contains presets actions (search, presets tree)
      */
-    public final JMenu presetsMenu = addMenu("Presets", /* I18N: mnemonic: P */ trc("menu", "Presets"), KeyEvent.VK_P, 7, ht("/Menu/Presets"));
+    public final JMenu presetsMenu = addMenu("Presets", /* I18N: mnemonic: P */ trc("menu", "Presets"), KeyEvent.VK_P, 8, ht("/Menu/Presets"));
     /**
      * submenu in Imagery menu that contains plugin-managed additional imagery layers
@@ -370,5 +379,5 @@
      * imageryMenu contains all imagery-related actions
      */
-    public final ImageryMenu imageryMenu = addMenu(new ImageryMenu(imagerySubMenu), /* untranslated name */ "Imagery", KeyEvent.VK_I, 8, ht("/Menu/Imagery"));
+    public final ImageryMenu imageryMenu = addMenu(new ImageryMenu(imagerySubMenu), /* untranslated name */ "Imagery", KeyEvent.VK_I, 9, ht("/Menu/Imagery"));
     // CHECKSTYLE.ON: LineLength
     /**
@@ -377,5 +386,5 @@
      * @since 6082
      */
-    public final JMenu gpsMenu = addMenu("GPS", /* I18N: mnemonic: G */ trc("menu", "GPS"), KeyEvent.VK_G, 9, ht("/Menu/GPS"));
+    public final JMenu gpsMenu = addMenu("GPS", /* I18N: mnemonic: G */ trc("menu", "GPS"), KeyEvent.VK_G, 10, ht("/Menu/GPS"));
     /** the window menu is split into several groups. The first is for windows that can be opened from
      * this menu any time, e.g. the changeset editor. The second group is for toggle dialogs and the third
@@ -383,5 +392,5 @@
      * to use WINDOW_MENU_GROUP to determine the group integer.
      */
-    public final JMenu windowMenu = addMenu("Windows", /* I18N: mnemonic: W */ trc("menu", "Windows"), KeyEvent.VK_W, 10, ht("/ToggleDialogs"));
+    public final JMenu windowMenu = addMenu("Windows", /* I18N: mnemonic: W */ trc("menu", "Windows"), KeyEvent.VK_W, 11, ht("/ToggleDialogs"));
 
     /**
@@ -392,7 +401,7 @@
      * helpMenu contains JOSM general actions (Help, About, etc.)
      */
-    public final JMenu helpMenu = addMenu("Help", /* I18N: mnemonic: H */ trc("menu", "Help"), KeyEvent.VK_H, 11, ht("/Menu/Help"));
-
-    private static final int defaultMenuPos = 11;
+    public final JMenu helpMenu = addMenu("Help", /* I18N: mnemonic: H */ trc("menu", "Help"), KeyEvent.VK_H, 12, ht("/Menu/Help"));
+
+    private static final int defaultMenuPos = 12;
 
     /** Move the selection up */
@@ -847,5 +856,5 @@
         windowMenu.addMenuListener(menuSeparatorHandler);
 
-        new PresetsMenuEnabler(presetsMenu);
+        new EditLayerMenuEnabler(Arrays.asList(modeMenu, presetsMenu));
     }
     // CHECKSTYLE.ON: ExecutableStatementCountCheck
@@ -867,4 +876,18 @@
         }
         return result;
+    }
+
+    /**
+     * Returns the {@link JCheckBoxMenuItem} for the given {@link MapMode}.
+     * @param mode map mode
+     * @return the {@code JCheckBoxMenuItem} for the given {@code MapMode}
+     * @since 15438
+     */
+    public Optional<JCheckBoxMenuItem> findMapModeMenuItem(MapMode mode) {
+        return Arrays.stream(modeMenu.getMenuComponents())
+                .filter(m -> m instanceof JCheckBoxMenuItem)
+                .map(m -> (JCheckBoxMenuItem) m)
+                .filter(m -> Objects.equals(mode, m.getAction()))
+                .findFirst();
     }
 
@@ -912,9 +935,9 @@
     }
 
-    static class PresetsMenuEnabler implements ActiveLayerChangeListener {
-        private final JMenu presetsMenu;
-
-        PresetsMenuEnabler(JMenu presetsMenu) {
-            this.presetsMenu = presetsMenu;
+    static class EditLayerMenuEnabler implements ActiveLayerChangeListener {
+        private final Collection<JMenu> menus;
+
+        EditLayerMenuEnabler(Collection<JMenu> menus) {
+            this.menus = Objects.requireNonNull(menus);
             MainApplication.getLayerManager().addAndFireActiveLayerChangeListener(this);
         }
@@ -922,5 +945,5 @@
         @Override
         public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
-            presetsMenu.setEnabled(e.getSource().getEditLayer() != null);
+            menus.forEach(m -> m.setEnabled(e.getSource().getEditLayer() != null));
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 15437)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 15438)
@@ -18,4 +18,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -83,4 +84,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -345,4 +347,5 @@
         MainApplication.getLayerManager().removeLayerChangeListener(this);
         MainApplication.getLayerManager().removeActiveLayerChangeListener(this);
+        MainApplication.getMenu().modeMenu.removeAll();
         dialogsPanel.destroy();
         Config.getPref().removePreferenceChangeListener(sidetoolbarPreferencesChangedListener);
@@ -436,4 +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()));
         allMapModeButtons.add(b);
         toolBarActionsGroup.add(b);
@@ -481,6 +485,10 @@
             newMapMode = null;
         }
+        Logging.info("Switching map mode from {0} to {1}",
+                Optional.ofNullable(oldMapMode).map(m -> m.getClass().getSimpleName()).orElse("(none)"),
+                Optional.ofNullable(newMapMode).map(m -> m.getClass().getSimpleName()).orElse("(none)"));
 
         if (oldMapMode != null) {
+            MainApplication.getMenu().findMapModeMenuItem(oldMapMode).ifPresent(m -> m.setSelected(false));
             oldMapMode.exitMode();
         }
@@ -488,4 +496,5 @@
         if (newMapMode != null) {
             newMapMode.enterMode();
+            MainApplication.getMenu().findMapModeMenuItem(newMapMode).ifPresent(m -> m.setSelected(true));
         }
         lastMapMode.put(newLayer, newMapMode);
