Index: trunk/src/org/openstreetmap/josm/tools/InputMapUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/InputMapUtils.java	(revision 14688)
+++ trunk/src/org/openstreetmap/josm/tools/InputMapUtils.java	(revision 14689)
@@ -4,4 +4,5 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
+import java.util.Optional;
 
 import javax.swing.Action;
@@ -128,4 +129,7 @@
         c.getActionMap().put("ctrl_enter", a);
         c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke, "ctrl_enter");
+        Optional.ofNullable(a.getValue(Action.SHORT_DESCRIPTION))
+                .map(String::valueOf)
+                .ifPresent(text -> Shortcut.setTooltip(a, text, stroke));
     }
 }
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 14688)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 14689)
@@ -135,14 +135,10 @@
      * @param sc Shortcut associated (to display accelerator between parenthesis)
      * @return Full tooltip text (name + accelerator)
-      */
+     * @since 1084
+     * @deprecated Use {@link Shortcut#makeTooltip} instead.
+      */
+    @Deprecated
     default String makeTooltip(String name, Shortcut sc) {
-        StringBuilder result = new StringBuilder();
-        result.append("<html>").append(name);
-        if (sc != null && !sc.getKeyText().isEmpty()) {
-            result.append(" <font size='-2'>(")
-                  .append(sc.getKeyText())
-                  .append(")</font>");
-        }
-        return result.append("&nbsp;</html>").toString();
+        return Shortcut.makeTooltip(name, sc != null ? sc.getKeyStroke() : null);
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 14688)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 14689)
@@ -27,6 +27,4 @@
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
-
-import javax.swing.UIManager;
 
 import org.openstreetmap.josm.data.Preferences;
@@ -355,33 +353,4 @@
 
     @Override
-    public String makeTooltip(String name, Shortcut sc) {
-        String lafid = UIManager.getLookAndFeel().getID();
-        boolean canHtml = true;
-        // "Mac" is the native LAF, "Aqua" is Quaqua. Both use native menus with native tooltips.
-        if (lafid.contains("Mac") || lafid.contains("Aqua")) {
-            canHtml = false;
-        }
-        StringBuilder result = new StringBuilder(48);
-        if (canHtml) {
-            result.append("<html>");
-        }
-        result.append(name);
-        if (sc != null && !sc.getKeyText().isEmpty()) {
-            result.append(' ');
-            if (canHtml) {
-                result.append("<font size='-2'>");
-            }
-            result.append('(').append(sc.getKeyText()).append(')');
-            if (canHtml) {
-                result.append("</font>");
-            }
-        }
-        if (canHtml) {
-            result.append("&nbsp;</html>");
-        }
-        return result.toString();
-    }
-
-    @Override
     public String getDefaultStyle() {
         return "com.apple.laf.AquaLookAndFeel";
Index: trunk/src/org/openstreetmap/josm/tools/Shortcut.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 14688)
+++ trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 14689)
@@ -18,6 +18,8 @@
 import javax.swing.AbstractAction;
 import javax.swing.AbstractButton;
+import javax.swing.Action;
 import javax.swing.JMenu;
 import javax.swing.KeyStroke;
+import javax.swing.UIManager;
 import javax.swing.text.JTextComponent;
 
@@ -270,4 +272,28 @@
     }
 
+    /**
+     * Sets the action tooltip to the tooltip text plus the {@linkplain #getKeyText(KeyStroke) key stroke text}
+     * this shortcut represents.
+     *
+     * @param action action
+     * @param tooltip Tooltip text to display
+     * @since 14689
+     */
+    public void setTooltip(Action action, String tooltip) {
+        setTooltip(action, tooltip, getKeyStroke());
+    }
+
+    /**
+     * Sets the action tooltip to the tooltip text plus the {@linkplain #getKeyText(KeyStroke) key stroke text}.
+     *
+     * @param action action
+     * @param tooltip Tooltip text to display
+     * @param keyStroke Key stroke associated (to display accelerator between parenthesis)
+     * @since 14689
+     */
+    public static void setTooltip(Action action, String tooltip, KeyStroke keyStroke) {
+        action.putValue(Action.SHORT_DESCRIPTION, makeTooltip(tooltip, keyStroke));
+    }
+
     @Override
     public String toString() {
@@ -595,3 +621,47 @@
                 .orElse(null);
     }
+
+    /**
+     * Returns the tooltip text plus the {@linkplain #getKeyText(KeyStroke) key stroke text}.
+     *
+     * Tooltips are usually not system dependent, unless the
+     * JVM is too dumb to provide correct names for all the keys.
+     *
+     * Some LAFs don't understand HTML, such as the OSX LAFs.
+     *
+     * @param tooltip Tooltip text to display
+     * @param keyStroke Key stroke associated (to display accelerator between parenthesis)
+     * @return Full tooltip text (tooltip + accelerator)
+     * @since 14689
+     */
+    public static String makeTooltip(String tooltip, KeyStroke keyStroke) {
+        final Optional<String> keyStrokeText = Optional.ofNullable(keyStroke)
+                .map(Shortcut::getKeyText)
+                .filter(text -> !text.isEmpty());
+
+        final String laf = UIManager.getLookAndFeel().getID();
+        // "Mac" is the native LAF, "Aqua" is Quaqua. Both use native menus with native tooltips.
+        final boolean canHtml = !(PlatformManager.isPlatformOsx() && (laf.contains("Mac") || laf.contains("Aqua")));
+
+        StringBuilder result = new StringBuilder(48);
+        if (canHtml) {
+            result.append("<html>");
+        }
+        result.append(tooltip);
+        if (keyStrokeText.isPresent()) {
+            result.append(' ');
+            if (canHtml) {
+                result.append("<font size='-2'>");
+            }
+            result.append('(').append(keyStrokeText.get()).append(')');
+            if (canHtml) {
+                result.append("</font>");
+            }
+        }
+        if (canHtml) {
+            result.append("&nbsp;</html>");
+        }
+        return result.toString();
+    }
+
 }
Index: trunk/test/unit/org/openstreetmap/josm/tools/ShortcutTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/tools/ShortcutTest.java	(revision 14689)
+++ trunk/test/unit/org/openstreetmap/josm/tools/ShortcutTest.java	(revision 14689)
@@ -0,0 +1,37 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.junit.Assert.assertEquals;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+
+import javax.swing.KeyStroke;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link Shortcut} class.
+ */
+public class ShortcutTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test method for {@code Shortcut#makeTooltip}
+     */
+    @Test
+    public void testMakeTooltip() {
+        assertEquals("<html>Foo Bar <font size='-2'>(Shift+J)</font>&nbsp;</html>",
+                Shortcut.makeTooltip("Foo Bar", KeyStroke.getKeyStroke(KeyEvent.VK_J, InputEvent.SHIFT_DOWN_MASK)));
+    }
+
+}
