commit a51a99e7d853a3449b4e127d9a33e4d6f0a786e4
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   2020-05-31 13:13:28 +0200

    fix #19327 - Deprecate JosmAction constructors, use setters

diff --git a/src/org/openstreetmap/josm/actions/AboutAction.java b/src/org/openstreetmap/josm/actions/AboutAction.java
index 505db8eb7..464db094f 100644
--- a/src/org/openstreetmap/josm/actions/AboutAction.java
+++ b/src/org/openstreetmap/josm/actions/AboutAction.java
@@ -61,9 +61,12 @@
      * Constructs a new {@code AboutAction}.
      */
     public AboutAction() {
-        super(tr("About"), "logo", tr("Display the about screen."),
-            Shortcut.registerShortcut("system:about", tr("About"),
-            KeyEvent.VK_F1, Shortcut.SHIFT), true, false);
+        super(false);
+        setName(tr("About"));
+        setIcon("logo");
+        setShortcut(Shortcut.registerShortcut("system:about", tr("About"), KeyEvent.VK_F1, Shortcut.SHIFT));
+        setTooltip(tr("Display the about screen."));
+        registerInToolbar("logo");
     }
 
     JPanel buildAboutPanel() {
diff --git a/src/org/openstreetmap/josm/actions/AbstractInfoAction.java b/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
index f07f39595..a0a8fa625 100644
--- a/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
+++ b/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
@@ -17,7 +17,6 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OpenBrowser;
-import org.openstreetmap.josm.tools.Shortcut;
 
 /**
  * Abstract base class for info actions, opening an URL describing a particular object.
@@ -33,25 +32,6 @@ public AbstractInfoAction(boolean installAdapters) {
         super(installAdapters);
     }
 
-    /**
-     * Constructs a new {@code AbstractInfoAction}.
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param register register this action for the toolbar preferences?
-     * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
-     * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
-     */
-    public AbstractInfoAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean register,
-            String toolbarId, boolean installAdapters) {
-        super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters);
-    }
-
     /**
      * Asks user confirmation before launching a large number of browser windows.
      * @param numBrowsers the number of browser windows to open
diff --git a/src/org/openstreetmap/josm/actions/AbstractMergeAction.java b/src/org/openstreetmap/josm/actions/AbstractMergeAction.java
index 3da551439..90a722208 100644
--- a/src/org/openstreetmap/josm/actions/AbstractMergeAction.java
+++ b/src/org/openstreetmap/josm/actions/AbstractMergeAction.java
@@ -19,7 +19,6 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -84,41 +83,6 @@ public TargetLayerDialogResult(T sel, boolean ch) {
         }
     }
 
-    /**
-     * Constructs a new {@code AbstractMergeAction}.
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param register register this action for the toolbar preferences?
-     */
-    public AbstractMergeAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean register) {
-        super(name, iconName, tooltip, shortcut, register);
-    }
-
-    /**
-     * Constructs a new {@code AbstractMergeAction}.
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param register register this action for the toolbar preferences?
-     * @param toolbar identifier for the toolbar preferences. The iconName is used, if this parameter is null
-     * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
-     */
-    public AbstractMergeAction(String name, String iconName, String tooltip, Shortcut shortcut,
-    boolean register, String toolbar, boolean installAdapters) {
-        super(name, iconName, tooltip, shortcut, register, toolbar, installAdapters);
-    }
-
     /**
      * Ask user to choose the target layer and shows a checkbox.
      * @param targetLayers list of candidate target layers.
diff --git a/src/org/openstreetmap/josm/actions/AbstractPasteAction.java b/src/org/openstreetmap/josm/actions/AbstractPasteAction.java
index 00ee85c63..7bfac246a 100644
--- a/src/org/openstreetmap/josm/actions/AbstractPasteAction.java
+++ b/src/org/openstreetmap/josm/actions/AbstractPasteAction.java
@@ -15,7 +15,6 @@
 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
 import org.openstreetmap.josm.gui.datatransfer.OsmTransferHandler;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Shortcut;
 
 /**
  * This is the base class for all actions that paste objects.
@@ -28,37 +27,8 @@
 
     /**
      * Constructs a new {@link AbstractPasteAction}.
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
      */
-    public AbstractPasteAction(String name, String iconName, String tooltip, Shortcut shortcut,
-            boolean registerInToolbar) {
-        this(name, iconName, tooltip, shortcut, registerInToolbar, null);
-    }
-
-    /**
-     * Constructs a new {@link AbstractPasteAction}.
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
-     * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
-     */
-    public AbstractPasteAction(String name, String iconName, String tooltip, Shortcut shortcut,
-            boolean registerInToolbar, String toolbarId) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar, toolbarId, true);
+    public AbstractPasteAction() {
         transferHandler = new OsmTransferHandler();
         ClipboardUtils.getClipboard().addFlavorListener(this);
     }
diff --git a/src/org/openstreetmap/josm/actions/AbstractUploadAction.java b/src/org/openstreetmap/josm/actions/AbstractUploadAction.java
index 234c0ac41..a4066c19a 100644
--- a/src/org/openstreetmap/josm/actions/AbstractUploadAction.java
+++ b/src/org/openstreetmap/josm/actions/AbstractUploadAction.java
@@ -6,7 +6,6 @@
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.tools.Shortcut;
 
 /**
  * Abstract super-class of all upload actions.
@@ -15,24 +14,6 @@
  */
 public abstract class AbstractUploadAction extends JosmAction {
 
-    /**
-     * Constructs a new {@code AbstractUploadAction}.
-     *
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
-     */
-    public AbstractUploadAction(String name, String iconName, String tooltip, Shortcut shortcut,
-            boolean registerInToolbar) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar);
-    }
-
     private final PropertyChangeListener updateOnRequireUploadChange = evt -> {
         if (OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP.equals(evt.getPropertyName())) {
             updateEnabledState();
diff --git a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
index e0e8dee82..f3c7344e5 100644
--- a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
@@ -71,11 +71,13 @@
      * @param info The imagery info
      */
     public AddImageryLayerAction(ImageryInfo info) {
-        super(info.getMenuName(), /* ICON */"imagery_menu", info.getToolTipText(), null,
-                true, ToolbarPreferences.IMAGERY_PREFIX + info.getToolbarName(), false);
+        super(false);
+        setName(info.getMenuName());
+        setIcon(/* ICON */ "imagery_menu");
+        setTooltip(info.getToolTipText());
+        registerInToolbar(ToolbarPreferences.IMAGERY_PREFIX + info.getToolbarName());
         setHelpId(ht("/Preferences/Imagery"));
         this.info = info;
-        installAdapters();
 
         // change toolbar icon from if specified
         String icon = info.getIcon();
diff --git a/src/org/openstreetmap/josm/actions/AddNodeAction.java b/src/org/openstreetmap/josm/actions/AddNodeAction.java
index 542164d70..e036ea0f3 100644
--- a/src/org/openstreetmap/josm/actions/AddNodeAction.java
+++ b/src/org/openstreetmap/josm/actions/AddNodeAction.java
@@ -33,9 +33,11 @@
      * Constructs a new {@code AddNodeAction}.
      */
     public AddNodeAction() {
-        super(tr("Add Node..."), "addnode", tr("Add a node by entering latitude / longitude or easting / northing."),
-                Shortcut.registerShortcut("addnode", tr("Edit: {0}", tr("Add Node...")),
-                        KeyEvent.VK_D, Shortcut.SHIFT), true);
+        setName(tr("Add Node..."));
+        setIcon("addnode");
+        setShortcut(Shortcut.registerShortcut("addnode", tr("Edit: {0}", tr("Add Node...")), KeyEvent.VK_D, Shortcut.SHIFT));
+        setTooltip(tr("Add a node by entering latitude / longitude or easting / northing."));
+        registerInToolbar("addnode");
         setHelpId(ht("/Action/AddNode"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
index 85f25eee9..1ca87e521 100644
--- a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
+++ b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
@@ -47,9 +47,12 @@
      * Constructs a new {@code AlignInCircleAction}.
      */
     public AlignInCircleAction() {
-        super(tr("Align Nodes in Circle"), "aligncircle", tr("Move the selected nodes into a circle."),
-                Shortcut.registerShortcut("tools:aligncircle", tr("Tool: {0}", tr("Align Nodes in Circle")),
-                        KeyEvent.VK_O, Shortcut.DIRECT), true);
+        setName(tr("Align Nodes in Circle"));
+        setIcon("aligncircle");
+        setShortcut(Shortcut.registerShortcut("tools:aligncircle", tr("Tool: {0}", tr("Align Nodes in Circle")),
+                KeyEvent.VK_O, Shortcut.DIRECT));
+        setTooltip(tr("Move the selected nodes into a circle."));
+        registerInToolbar("aligncircle");
         setHelpId(ht("/Action/AlignInCircle"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/AlignInLineAction.java b/src/org/openstreetmap/josm/actions/AlignInLineAction.java
index 9bf800da8..60debb6e7 100644
--- a/src/org/openstreetmap/josm/actions/AlignInLineAction.java
+++ b/src/org/openstreetmap/josm/actions/AlignInLineAction.java
@@ -54,8 +54,11 @@
      * Constructs a new {@code AlignInLineAction}.
      */
     public AlignInLineAction() {
-        super(tr("Align Nodes in Line"), "alignline", tr("Move the selected nodes in to a line."),
-                Shortcut.registerShortcut("tools:alignline", tr("Tool: {0}", tr("Align Nodes in Line")), KeyEvent.VK_L, Shortcut.DIRECT), true);
+        setName(tr("Align Nodes in Line"));
+        setIcon("alignline");
+        setShortcut(Shortcut.registerShortcut("tools:alignline", tr("Tool: {0}", tr("Align Nodes in Line")), KeyEvent.VK_L, Shortcut.DIRECT));
+        setTooltip(tr("Move the selected nodes in to a line."));
+        registerInToolbar("alignline");
         setHelpId(ht("/Action/AlignInLine"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/AutoScaleAction.java b/src/org/openstreetmap/josm/actions/AutoScaleAction.java
index 989554605..92b72da5d 100644
--- a/src/org/openstreetmap/josm/actions/AutoScaleAction.java
+++ b/src/org/openstreetmap/josm/actions/AutoScaleAction.java
@@ -198,11 +198,15 @@ private AutoScaleAction(AutoScaleMode mode, boolean marker) {
      * @since 14221
      */
     public AutoScaleAction(final AutoScaleMode mode) {
-        super(tr("Zoom to {0}", mode.getLocalizedLabel()), "dialogs/autoscale/" + mode.getEnglishLabel(),
-              tr("Zoom the view to {0}.", mode.getLocalizedLabel()),
-              Shortcut.registerShortcut("view:zoom" + mode.getEnglishLabel(),
-                        tr("View: {0}", tr("Zoom to {0}", mode.getLocalizedLabel())),
-                        getModeShortcut(mode.getEnglishLabel()), Shortcut.DIRECT), true, null, false);
+        super(false);
+        setName(tr("Zoom to {0}", mode.getLocalizedLabel()));
+        setTooltip(tr("Zoom the view to {0}.", mode.getLocalizedLabel()));
+        String iconName = "dialogs/autoscale/" + mode.getEnglishLabel();
+        setIcon(iconName);
+        registerInToolbar(iconName);
+        setShortcut(Shortcut.registerShortcut("view:zoom" + mode.getEnglishLabel(),
+                tr("View: {0}", tr("Zoom to {0}", mode.getLocalizedLabel())),
+                getModeShortcut(mode.getEnglishLabel()), Shortcut.DIRECT));
         String label = mode.getEnglishLabel();
         String modeHelp = Character.toUpperCase(label.charAt(0)) + label.substring(1);
         setHelpId("Action/AutoScale/" + modeHelp);
diff --git a/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java b/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java
index 46e62eb90..4272f2c4b 100644
--- a/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/ChangesetManagerToggleAction.java
@@ -25,12 +25,13 @@
      * Constructs a new {@code ChangesetManagerToggleAction}.
      */
     public ChangesetManagerToggleAction() {
-        super(tr("Changeset Manager"),
-                new ImageProvider("dialogs/changeset/changesetmanager").setOptional(true),
-                tr("Toggle visibility of Changeset Manager window"),
-                Shortcut.registerShortcut("menu:windows:changesetdialog",
-                        tr("Toggle visibility of Changeset Manager window"), KeyEvent.VK_C, Shortcut.ALT_CTRL),
-                true /* register shortcut */, "dialogs/changeset/changesetmanager", false);
+        super(false);
+        setName(tr("Changeset Manager"));
+        setIcon(new ImageProvider("dialogs/changeset/changesetmanager").setOptional(true));
+        setShortcut(Shortcut.registerShortcut("menu:windows:changesetdialog",
+                tr("Toggle visibility of Changeset Manager window"), KeyEvent.VK_C, Shortcut.ALT_CTRL));
+        setTooltip(tr("Toggle visibility of Changeset Manager window"));
+        registerInToolbar("dialogs/changeset/changesetmanager");
         notifySelectedState();
         changesetCacheManagerClosedHandler = new ChangesetCacheManagerClosedHandler();
         setHelpId(ht("/Dialog/ChangesetManager"));
diff --git a/src/org/openstreetmap/josm/actions/CloseChangesetAction.java b/src/org/openstreetmap/josm/actions/CloseChangesetAction.java
index 02e8c0d45..cfb6948f0 100644
--- a/src/org/openstreetmap/josm/actions/CloseChangesetAction.java
+++ b/src/org/openstreetmap/josm/actions/CloseChangesetAction.java
@@ -45,14 +45,13 @@
      * Constructs a new {@code CloseChangesetAction}.
      */
     public CloseChangesetAction() {
-        super(tr("Close open changesets..."),
-            "closechangeset",
-            tr("Close open changesets"),
-            Shortcut.registerShortcut("system:closechangeset",
-                tr("File: {0}", tr("Close open changesets")),
-                KeyEvent.VK_Q, Shortcut.ALT_CTRL),
-            true, false
-        );
+        super(false);
+        setName(tr("Close open changesets..."));
+        setIcon("closechangeset");
+        setShortcut(Shortcut.registerShortcut("system:closechangeset", tr("File: {0}", tr("Close open changesets")),
+                KeyEvent.VK_Q, Shortcut.ALT_CTRL));
+        setTooltip(tr("Close open changesets"));
+        registerInToolbar("closechangeset");
         setHelpId(ht("/Action/CloseChangeset"));
         setEnabled(!NetworkManager.isOffline(OnlineResource.OSM_API));
 
diff --git a/src/org/openstreetmap/josm/actions/CombineWayAction.java b/src/org/openstreetmap/josm/actions/CombineWayAction.java
index 1cfa93010..89f10fa38 100644
--- a/src/org/openstreetmap/josm/actions/CombineWayAction.java
+++ b/src/org/openstreetmap/josm/actions/CombineWayAction.java
@@ -62,8 +62,11 @@
      * Constructs a new {@code CombineWayAction}.
      */
     public CombineWayAction() {
-        super(tr("Combine Way"), "combineway", tr("Combine several ways into one."),
-                Shortcut.registerShortcut("tools:combineway", tr("Tool: {0}", tr("Combine Way")), KeyEvent.VK_C, Shortcut.DIRECT), true);
+        setName(tr("Combine Way"));
+        setIcon("combineway");
+        setShortcut(Shortcut.registerShortcut("tools:combineway", tr("Tool: {0}", tr("Combine Way")), KeyEvent.VK_C, Shortcut.DIRECT));
+        setTooltip(tr("Combine several ways into one."));
+        registerInToolbar("combineway");
         setHelpId(ht("/Action/CombineWay"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/CopyAction.java b/src/org/openstreetmap/josm/actions/CopyAction.java
index 4eeacea9a..8d7faac10 100644
--- a/src/org/openstreetmap/josm/actions/CopyAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyAction.java
@@ -30,9 +30,11 @@
      * Constructs a new {@code CopyAction}.
      */
     public CopyAction() {
-        super(tr("Copy"), "copy",
-                tr("Copy selected objects to paste buffer."),
-                Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.CTRL), true);
+        setName(tr("Copy"));
+        setIcon("copy");
+        setShortcut(Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.CTRL));
+        setTooltip(tr("Copy selected objects to paste buffer."));
+        registerInToolbar("copy");
         setHelpId(ht("/Action/Copy"));
         // CUA shortcut for copy (https://en.wikipedia.org/wiki/IBM_Common_User_Access#Description)
         MainApplication.registerActionShortcut(this,
diff --git a/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java b/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
index 7fc45ff7c..7e0e9bc58 100644
--- a/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
@@ -27,11 +27,9 @@
      * Constructs a new {@code CopyCoordinatesAction}.
      */
     public CopyCoordinatesAction() {
-        super(tr("Copy Coordinates"), null,
-                tr("Copy coordinates of selected nodes to clipboard."),
-                Shortcut.registerShortcut("copy:coordinates", tr("Edit: {0}", tr("Copy Coordinates")),
-                KeyEvent.VK_C, Shortcut.CTRL_SHIFT),
-                false);
+        setName(tr("Copy Coordinates"));
+        setShortcut(Shortcut.registerShortcut("copy:coordinates", tr("Edit: {0}", tr("Copy Coordinates")), KeyEvent.VK_C, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Copy coordinates of selected nodes to clipboard."));
         setToolbarId("copy/coordinates");
     }
 
diff --git a/src/org/openstreetmap/josm/actions/CreateCircleAction.java b/src/org/openstreetmap/josm/actions/CreateCircleAction.java
index 594167bc2..e3e541942 100644
--- a/src/org/openstreetmap/josm/actions/CreateCircleAction.java
+++ b/src/org/openstreetmap/josm/actions/CreateCircleAction.java
@@ -56,9 +56,11 @@
      * Constructs a new {@code CreateCircleAction}.
      */
     public CreateCircleAction() {
-        super(tr("Create Circle"), "aligncircle", tr("Create a circle from three selected nodes."),
-            Shortcut.registerShortcut("tools:createcircle", tr("Tool: {0}", tr("Create Circle")),
-            KeyEvent.VK_O, Shortcut.SHIFT), true, "createcircle", true);
+        setName(tr("Create Circle"));
+        setIcon("aligncircle");
+        setShortcut(Shortcut.registerShortcut("tools:createcircle", tr("Tool: {0}", tr("Create Circle")), KeyEvent.VK_O, Shortcut.SHIFT));
+        setTooltip(tr("Create a circle from three selected nodes."));
+        registerInToolbar("createcircle");
         setHelpId(ht("/Action/CreateCircle"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java b/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
index 0bc9f4958..badf05c54 100644
--- a/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
+++ b/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
@@ -79,15 +79,18 @@
      * @param update {@code true} if the multipolygon must be updated, {@code false} if it must be created
      */
     public CreateMultipolygonAction(final boolean update) {
-        super(getName(update), /* ICON */ "multipoly_create", getName(update),
-                /* at least three lines for each shortcut or the server extractor fails */
-                update ? Shortcut.registerShortcut("tools:multipoly_update",
-                            tr("Tool: {0}", getName(true)),
-                            KeyEvent.VK_B, Shortcut.CTRL_SHIFT)
-                       : Shortcut.registerShortcut("tools:multipoly_create",
-                            tr("Tool: {0}", getName(false)),
-                            KeyEvent.VK_B, Shortcut.CTRL),
-                true, update ? "multipoly_update" : "multipoly_create", true);
+        setName(getName(update));
+        setTooltip(getName(update));
+        setIcon(/* ICON */ "multipoly_create");
+
+        /* at least three lines for each shortcut or the server extractor fails */
+        setShortcut(update ? Shortcut.registerShortcut("tools:multipoly_update",
+                    tr("Tool: {0}", getName(true)),
+                    KeyEvent.VK_B, Shortcut.CTRL_SHIFT)
+               : Shortcut.registerShortcut("tools:multipoly_create",
+                    tr("Tool: {0}", getName(false)),
+                    KeyEvent.VK_B, Shortcut.CTRL));
+        registerInToolbar(update ? "multipoly_update" : "multipoly_create");
         this.update = update;
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DeleteAction.java b/src/org/openstreetmap/josm/actions/DeleteAction.java
index a3c556b76..1b345c903 100644
--- a/src/org/openstreetmap/josm/actions/DeleteAction.java
+++ b/src/org/openstreetmap/josm/actions/DeleteAction.java
@@ -60,8 +60,11 @@ public boolean confirmDeletionFromRelation(Collection<RelationToChildReference>
      * Constructs a new {@code DeleteAction}.
      */
     public DeleteAction() {
-        super(tr("Delete"), "dialogs/delete", tr("Delete selected objects."),
-                Shortcut.registerShortcut("system:delete", tr("Edit: {0}", tr("Delete")), KeyEvent.VK_DELETE, Shortcut.DIRECT), true);
+        setName(tr("Delete"));
+        setIcon("dialogs/delete");
+        setShortcut(Shortcut.registerShortcut("system:delete", tr("Edit: {0}", tr("Delete")), KeyEvent.VK_DELETE, Shortcut.DIRECT));
+        setTooltip(tr("Delete selected objects."));
+        registerInToolbar("dialogs/delete");
         setHelpId(ht("/Action/Delete"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DeleteLayerAction.java b/src/org/openstreetmap/josm/actions/DeleteLayerAction.java
index e4fc253c2..972e0845d 100644
--- a/src/org/openstreetmap/josm/actions/DeleteLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/DeleteLayerAction.java
@@ -21,9 +21,11 @@
      * Constructs a {@link DeleteLayerAction} which will delete the active layer.
      */
     public DeleteLayerAction() {
-        super(tr("Delete Layer"), "dialogs/delete", tr("Delete the active layer. Does not delete the associated file."),
-                Shortcut.registerShortcut("system:deletelayer", tr("File: {0}", tr("Delete Layer")), KeyEvent.VK_F4, Shortcut.CTRL),
-                true, "delete-layer", true);
+        setName(tr("Delete Layer"));
+        setIcon("dialogs/delete");
+        setShortcut(Shortcut.registerShortcut("system:deletelayer", tr("File: {0}", tr("Delete Layer")), KeyEvent.VK_F4, Shortcut.CTRL));
+        setTooltip(tr("Delete the active layer. Does not delete the associated file."));
+        registerInToolbar("delete-layer");
         setHelpId(ht("/Action/DeleteLayer"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DialogsToggleAction.java b/src/org/openstreetmap/josm/actions/DialogsToggleAction.java
index d53e22fbc..a2673a02b 100644
--- a/src/org/openstreetmap/josm/actions/DialogsToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/DialogsToggleAction.java
@@ -10,7 +10,6 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -27,13 +26,11 @@
      * Constructs a new {@code DialogsToggleAction}.
      */
     public DialogsToggleAction() {
-        super(tr("Dialogs panel"),
-              (ImageProvider) null, /* no icon */
-              tr("Toggle dialogs panel, maximize mapview"),
-              Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"), KeyEvent.VK_TAB, Shortcut.DIRECT),
-              true, "dialogspanel", /* register in toolbar */
-              false
-        );
+        super(false);
+        setName(tr("Dialogs panel"));
+        setShortcut(Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"), KeyEvent.VK_TAB, Shortcut.DIRECT));
+        setTooltip(tr("Toggle dialogs panel, maximize mapview"));
+        registerInToolbar("dialogspanel");
         setHelpId(ht("/ToggleDialogs"));
         setSelected(Config.getPref().getBoolean("draw.dialogspanel", true));
         notifySelectedState();
diff --git a/src/org/openstreetmap/josm/actions/DiskAccessAction.java b/src/org/openstreetmap/josm/actions/DiskAccessAction.java
index c09fb2b7a..a9a1806bd 100644
--- a/src/org/openstreetmap/josm/actions/DiskAccessAction.java
+++ b/src/org/openstreetmap/josm/actions/DiskAccessAction.java
@@ -16,6 +16,14 @@
  */
 public abstract class DiskAccessAction extends JosmAction {
 
+    /**
+     * Constructs a new {@code DiskAccessAction}.
+     * @param installAdapters False, if you don't want to install layer changed and selection changed adapters
+     */
+    public DiskAccessAction(boolean installAdapters) {
+        super(installAdapters);
+    }
+
     /**
      * Constructs a new {@code DiskAccessAction}.
      *
@@ -24,7 +32,9 @@
      * @param tooltip A longer description of the action that will be displayed in the tooltip
      * @param shortcut A ready-created shortcut object or {@code null} if you don't want a shortcut
      * @since 1084
+     * @deprecated use {@link #DiskAccessAction(boolean)} and setters
      */
+    @Deprecated
     public DiskAccessAction(String name, String iconName, String tooltip, Shortcut shortcut) {
         super(name, iconName, tooltip, shortcut, true);
     }
@@ -40,7 +50,9 @@ public DiskAccessAction(String name, String iconName, String tooltip, Shortcut s
      * @param toolbarId Identifier for the toolbar preferences. The iconName is used, if this parameter is null
      * @param installAdapters False, if you don't want to install layer changed and selection changed adapters
      * @since 5438
+     * @deprecated use {@link #DiskAccessAction(boolean)} and setters
      */
+    @Deprecated
     public DiskAccessAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean register,
             String toolbarId, boolean installAdapters) {
         super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters);
diff --git a/src/org/openstreetmap/josm/actions/DistributeAction.java b/src/org/openstreetmap/josm/actions/DistributeAction.java
index fbc536f2e..0c50d9318 100644
--- a/src/org/openstreetmap/josm/actions/DistributeAction.java
+++ b/src/org/openstreetmap/josm/actions/DistributeAction.java
@@ -37,10 +37,11 @@
      * Constructs a new {@code DistributeAction}.
      */
     public DistributeAction() {
-        super(tr("Distribute Nodes"), "distribute",
-              tr("Distribute the selected nodes to equal distances along a line."),
-              Shortcut.registerShortcut("tools:distribute", tr("Tool: {0}", tr("Distribute Nodes")), KeyEvent.VK_B, Shortcut.SHIFT),
-              true);
+        setName(tr("Distribute Nodes"));
+        setIcon("distribute");
+        setShortcut(Shortcut.registerShortcut("tools:distribute", tr("Tool: {0}", tr("Distribute Nodes")), KeyEvent.VK_B, Shortcut.SHIFT));
+        setTooltip(tr("Distribute the selected nodes to equal distances along a line."));
+        registerInToolbar("distribute");
         setHelpId(ht("/Action/DistributeNodes"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DownloadAction.java b/src/org/openstreetmap/josm/actions/DownloadAction.java
index f70cd1a6d..7519c3992 100644
--- a/src/org/openstreetmap/josm/actions/DownloadAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadAction.java
@@ -24,9 +24,12 @@
      * Constructs a new {@code DownloadAction}.
      */
     public DownloadAction() {
-        super(tr("Download data..."), "download", tr("Download map data from a server of your choice"),
-              Shortcut.registerShortcut("file:download", tr("File: {0}", tr("Download data")), KeyEvent.VK_DOWN, Shortcut.CTRL_SHIFT),
-              true, false);
+        super(false);
+        setName(tr("Download data..."));
+        setIcon("download");
+        setShortcut(Shortcut.registerShortcut("file:download", tr("File: {0}", tr("Download data")), KeyEvent.VK_DOWN, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Download map data from a server of your choice"));
+        registerInToolbar("download");
         setHelpId(ht("/Action/Download"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DownloadAlongAction.java b/src/org/openstreetmap/josm/actions/DownloadAlongAction.java
index 17bd45fd1..9a9aaa55f 100644
--- a/src/org/openstreetmap/josm/actions/DownloadAlongAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadAlongAction.java
@@ -32,7 +32,6 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -47,22 +46,6 @@
      */
     protected abstract PleaseWaitRunnable createTask();
 
-    /**
-     * Constructs a new {@code DownloadAlongAction}
-     * @param name the action's text as displayed in the menu
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param registerInToolbar register this action for the toolbar preferences?
-     */
-    public DownloadAlongAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar);
-    }
-
     protected static void addToDownload(Area a, Rectangle2D r, Collection<Rectangle2D> results, double maxArea) {
         Area tmp = new Area(r);
         // intersect with sought-after area
diff --git a/src/org/openstreetmap/josm/actions/DownloadAlongWayAction.java b/src/org/openstreetmap/josm/actions/DownloadAlongWayAction.java
index 0a30bccb0..a8f9cfa98 100644
--- a/src/org/openstreetmap/josm/actions/DownloadAlongWayAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadAlongWayAction.java
@@ -35,9 +35,11 @@
      * Create new {@link DownloadAlongWayAction}.
      */
     public DownloadAlongWayAction() {
-        super(tr("Download along..."), "download_along_way", tr("Download OSM data along the selected ways."),
-                Shortcut.registerShortcut("file:download_along", tr("File: {0}", tr("Download Along")),
-                        KeyEvent.VK_D, Shortcut.ALT_SHIFT), true);
+        setName(tr("Download along..."));
+        setIcon("download_along_way");
+        setShortcut(Shortcut.registerShortcut("file:download_along", tr("File: {0}", tr("Download Along")), KeyEvent.VK_D, Shortcut.ALT_SHIFT));
+        setTooltip(tr("Download OSM data along the selected ways."));
+        registerInToolbar("download_along_way");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java b/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java
index 7c2f68a94..e94936785 100644
--- a/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java
@@ -22,8 +22,10 @@
 public final class DownloadNotesInViewAction extends JosmAction {
 
     private DownloadNotesInViewAction(String iconName) {
-        super(tr("Download notes in current view"), iconName, tr("Download notes in current view"), null, false,
-                "dialogs/notes/download_in_view", true);
+        setName(tr("Download notes in current view"));
+        setIcon(iconName);
+        setTooltip(tr("Download notes in current view"));
+        setToolbarId("dialogs/notes/download_in_view");
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java b/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java
index 0108a9dae..fb8bfc644 100644
--- a/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java
@@ -26,8 +26,10 @@
      * Creates a new {@code DownloadOsmInViewAction}.
      */
     public DownloadOsmInViewAction() {
-        super(tr("Download in current view"), "download_in_view", tr("Download map data from the OSM server in current view"), null, false,
-                "dialogs/download_in_view", true);
+        setName(tr("Download in current view"));
+        setIcon("download_in_view");
+        setTooltip(tr("Download map data from the OSM server in current view"));
+        setToolbarId("dialogs/download_in_view");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java b/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
index 263bf1ff6..e4e18507d 100644
--- a/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
@@ -32,8 +32,12 @@
      * Constructs a new {@code DownloadPrimitiveAction}.
      */
     public DownloadPrimitiveAction() {
-        super(tr("Download object..."), "downloadprimitive", tr("Download OSM object by ID"),
-                SHORTCUT, true, false);
+        super(false);
+        setName(tr("Download object..."));
+        setIcon("downloadprimitive");
+        setShortcut(SHORTCUT);
+        setTooltip(tr("Download OSM object by ID"));
+        registerInToolbar("downloadprimitive");
         setHelpId(ht("/Action/DownloadObject"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java b/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
index 69ac3d8e6..13d5b3dab 100644
--- a/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
@@ -25,11 +25,12 @@
      * Constructs a new {@code DownloadReferrersAction}.
      */
     public DownloadReferrersAction() {
-        super(tr("Download parent ways/relations..."), "download",
-                tr("Download objects referring to one of the selected objects"),
-                Shortcut.registerShortcut("file:downloadreferrers",
-                        tr("File: {0}", tr("Download parent ways/relations...")), KeyEvent.VK_D, Shortcut.ALT_CTRL),
-                true, "downloadreferrers", true);
+        setName(tr("Download parent ways/relations..."));
+        setIcon("download");
+        setShortcut(Shortcut.registerShortcut("file:downloadreferrers",
+                tr("File: {0}", tr("Download parent ways/relations...")), KeyEvent.VK_D, Shortcut.ALT_CTRL));
+        setTooltip(tr("Download objects referring to one of the selected objects"));
+        registerInToolbar("downloadreferrers");
         setHelpId(ht("/Action/DownloadParentWaysAndRelation"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DuplicateAction.java b/src/org/openstreetmap/josm/actions/DuplicateAction.java
index 0918a773c..9ba84922a 100644
--- a/src/org/openstreetmap/josm/actions/DuplicateAction.java
+++ b/src/org/openstreetmap/josm/actions/DuplicateAction.java
@@ -23,9 +23,11 @@
      * Constructs a new {@code DuplicateAction}.
      */
     public DuplicateAction() {
-        super(tr("Duplicate"), "duplicate",
-                tr("Duplicate selection."),
-                Shortcut.registerShortcut("system:duplicate", tr("Edit: {0}", tr("Duplicate")), KeyEvent.VK_D, Shortcut.CTRL), true);
+        setName(tr("Duplicate"));
+        setIcon("duplicate");
+        setShortcut(Shortcut.registerShortcut("system:duplicate", tr("Edit: {0}", tr("Duplicate")), KeyEvent.VK_D, Shortcut.CTRL));
+        setTooltip(tr("Duplicate selection."));
+        registerInToolbar("duplicate");
         setHelpId(ht("/Action/Duplicate"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/ExitAction.java b/src/org/openstreetmap/josm/actions/ExitAction.java
index 2e010cfc6..9aa368d80 100644
--- a/src/org/openstreetmap/josm/actions/ExitAction.java
+++ b/src/org/openstreetmap/josm/actions/ExitAction.java
@@ -20,8 +20,12 @@
      * Construct the action with "Exit" as label
      */
     public ExitAction() {
-        super(tr("Exit"), "exit", tr("Exit the application."),
-                Shortcut.registerShortcut("system:menuexit", tr("Exit"), KeyEvent.VK_Q, Shortcut.CTRL), true, false);
+        super(false);
+        setName(tr("Exit"));
+        setIcon("exit");
+        setShortcut(Shortcut.registerShortcut("system:menuexit", tr("Exit"), KeyEvent.VK_Q, Shortcut.CTRL));
+        setTooltip(tr("Exit the application."));
+        registerInToolbar("exit");
         setHelpId(ht("/Action/Exit"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/ExpertToggleAction.java b/src/org/openstreetmap/josm/actions/ExpertToggleAction.java
index 76c6e6837..4838a672d 100644
--- a/src/org/openstreetmap/josm/actions/ExpertToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/ExpertToggleAction.java
@@ -7,7 +7,6 @@
 import java.awt.event.ActionEvent;
 
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ListenerList;
 
@@ -109,16 +108,11 @@ public static synchronized boolean hasVisibilitySwitcher(Component c) {
      * Constructs a new {@code ExpertToggleAction}.
      */
     public ExpertToggleAction() {
-        super(tr("Expert Mode"),
-                new ImageProvider("expert").setOptional(true),
-              tr("Enable/disable expert mode"),
-              null,
-              false /* register toolbar */, null, false
-        );
-        setToolbarId("expertmode");
-        if (MainApplication.getToolbar() != null) {
-            MainApplication.getToolbar().register(this);
-        }
+        super(false);
+        setName(tr("Expert Mode"));
+        setIcon(new ImageProvider("expert").setOptional(true));
+        setTooltip(tr("Enable/disable expert mode"));
+        registerInToolbar("expertmode");
         setSelected(PREF_EXPERT.get());
         notifySelectedState();
     }
diff --git a/src/org/openstreetmap/josm/actions/FollowLineAction.java b/src/org/openstreetmap/josm/actions/FollowLineAction.java
index 3783bce34..a8cf356d7 100644
--- a/src/org/openstreetmap/josm/actions/FollowLineAction.java
+++ b/src/org/openstreetmap/josm/actions/FollowLineAction.java
@@ -40,13 +40,11 @@
      * Constructs a new {@code FollowLineAction}.
      */
     public FollowLineAction() {
-        super(
-                tr("Follow line"),
-                "followline",
-                tr("Continues drawing a line that shares nodes with another line."),
-                Shortcut.registerShortcut("tools:followline", tr(
-                "Tool: {0}", tr("Follow")),
-                KeyEvent.VK_F, Shortcut.DIRECT), true);
+        setName(tr("Follow line"));
+        setIcon("followline");
+        setShortcut(Shortcut.registerShortcut("tools:followline", tr("Tool: {0}", tr("Follow")), KeyEvent.VK_F, Shortcut.DIRECT));
+        setTooltip(tr("Continues drawing a line that shares nodes with another line."));
+        registerInToolbar("followline");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java b/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java
index 25e888b0d..ab3104d00 100644
--- a/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/FullscreenToggleAction.java
@@ -36,15 +36,12 @@
      * Constructs a new {@code FullscreenToggleAction}.
      */
     public FullscreenToggleAction() {
-        super(tr("Fullscreen view"),
-              null, /* no icon */
-              tr("Toggle fullscreen view"),
-              Shortcut.registerShortcut("menu:view:fullscreen", tr("Toggle fullscreen view"), KeyEvent.VK_F11, Shortcut.DIRECT),
-              false /* register */, null, false
-        );
+        super(false);
+        setName(tr("Fullscreen view"));
+        setShortcut(Shortcut.registerShortcut("menu:view:fullscreen", tr("Toggle fullscreen view"), KeyEvent.VK_F11, Shortcut.DIRECT));
+        setTooltip(tr("Toggle fullscreen view"));
         setHelpId(ht("/Action/FullscreenView"));
-        setToolbarId("fullscreen");
-        MainApplication.getToolbar().register(this);
+        registerInToolbar("fullscreen");
         gd = GraphicsEnvironment.isHeadless() ? null : GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
         setSelected(Config.getPref().getBoolean("draw.fullscreen", false));
         notifySelectedState();
diff --git a/src/org/openstreetmap/josm/actions/GpxExportAction.java b/src/org/openstreetmap/josm/actions/GpxExportAction.java
index 601ec619e..5301d83f0 100644
--- a/src/org/openstreetmap/josm/actions/GpxExportAction.java
+++ b/src/org/openstreetmap/josm/actions/GpxExportAction.java
@@ -33,27 +33,24 @@
      * Constructs a new {@code GpxExportAction}.
      */
     public GpxExportAction() {
-        super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
-                Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.CTRL));
+        super(true);
+        setName(tr("Export to GPX..."));
+        setIcon("exportgpx");
+        setShortcut(Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.CTRL));
+        setTooltip(tr("Export the data to GPX file."));
+        registerInToolbar("exportgpx");
         setHelpId(ht("/Action/GpxExport"));
     }
 
     /**
      * Deferring constructor for child classes.
      *
-     * @param name see {@code DiskAccessAction}
-     * @param iconName see {@code DiskAccessAction}
-     * @param tooltip see {@code DiskAccessAction}
-     * @param shortcut see {@code DiskAccessAction}
-     * @param register see {@code DiskAccessAction}
-     * @param toolbarId see {@code DiskAccessAction}
      * @param installAdapters see {@code DiskAccessAction}
      *
      * @since 13210
      */
-    protected GpxExportAction(String name, String iconName, String tooltip, Shortcut shortcut,
-            boolean register, String toolbarId, boolean installAdapters) {
-        super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters);
+    protected GpxExportAction(boolean installAdapters) {
+        super(installAdapters);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/HelpAction.java b/src/org/openstreetmap/josm/actions/HelpAction.java
index fa2c4b9da..e0e04f32d 100644
--- a/src/org/openstreetmap/josm/actions/HelpAction.java
+++ b/src/org/openstreetmap/josm/actions/HelpAction.java
@@ -32,9 +32,11 @@ public HelpAction() {
     }
 
     private HelpAction(boolean shortcut) {
-        super(tr("Help"), "help", null,
-                shortcut ? Shortcut.registerShortcut("system:help", tr("Help"), KeyEvent.VK_F1, Shortcut.DIRECT) : null,
-                true, false);
+        super(false);
+        setName(tr("Help"));
+        setIcon("help");
+        setShortcut(shortcut ? Shortcut.registerShortcut("system:help", tr("Help"), KeyEvent.VK_F1, Shortcut.DIRECT) : null);
+        registerInToolbar("help");
         setEnabled(!NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
index d0a01cdd0..21d3debe9 100644
--- a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
+++ b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
@@ -35,9 +35,12 @@
      * Constructs a new {@code HistoryInfoAction}.
      */
     public HistoryInfoAction() {
-        super(tr("History"), "dialogs/history",
-                tr("Display history information about OSM ways, nodes, or relations."),
-                SHORTCUT, true, "action/historyinfo", false);
+        super(false);
+        setName(tr("History"));
+        setIcon("dialogs/history");
+        setShortcut(SHORTCUT);
+        setTooltip(tr("Display history information about OSM ways, nodes, or relations."));
+        registerInToolbar("action/historyinfo");
         setHelpId(ht("/Action/ObjectHistory"));
         setEnabled(true);
     }
diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
index 860b9f928..f9a05b09f 100644
--- a/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
+++ b/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
@@ -21,11 +21,12 @@
      * Constructs a new {@code HistoryInfoWebAction}.
      */
     public HistoryInfoWebAction() {
-        super(tr("History (web)"), "dialogs/history",
-                tr("Display history information about OSM ways, nodes, or relations in web browser."),
-                Shortcut.registerShortcut("core:historyinfoweb",
-                        tr("History (web)"), KeyEvent.VK_H, Shortcut.CTRL_SHIFT),
-                true, "action/historyinfoweb", true);
+        super(true);
+        setName(tr("History (web)"));
+        setIcon("dialogs/history");
+        setShortcut(Shortcut.registerShortcut("core:historyinfoweb", tr("History (web)"), KeyEvent.VK_H, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Display history information about OSM ways, nodes, or relations in web browser."));
+        registerInToolbar("action/historyinfoweb");
         setHelpId(ht("/Action/ObjectHistoryWeb"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/InfoAction.java b/src/org/openstreetmap/josm/actions/InfoAction.java
index da04f5718..8cb398e90 100644
--- a/src/org/openstreetmap/josm/actions/InfoAction.java
+++ b/src/org/openstreetmap/josm/actions/InfoAction.java
@@ -23,11 +23,11 @@
      * Constructs a new {@code InfoAction}.
      */
     public InfoAction() {
-        super(tr("Advanced info"), "info",
-            tr("Display advanced object information about OSM nodes, ways, or relations."),
-            Shortcut.registerShortcut("core:info",
-                tr("Advanced info"), KeyEvent.VK_I, Shortcut.CTRL),
-            true, "action/info", true);
+        setName(tr("Advanced info"));
+        setIcon("info");
+        setShortcut(Shortcut.registerShortcut("core:info", tr("Advanced info"), KeyEvent.VK_I, Shortcut.CTRL));
+        setTooltip(tr("Display advanced object information about OSM nodes, ways, or relations."));
+        registerInToolbar("action/info");
         setHelpId(ht("/Action/InfoAboutElements"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/InfoWebAction.java b/src/org/openstreetmap/josm/actions/InfoWebAction.java
index 53c4d6f2f..92182b539 100644
--- a/src/org/openstreetmap/josm/actions/InfoWebAction.java
+++ b/src/org/openstreetmap/josm/actions/InfoWebAction.java
@@ -25,11 +25,12 @@
      * Constructs a new {@code InfoWebAction}.
      */
     public InfoWebAction() {
-        super(tr("Advanced info (web)"), "info",
-                tr("Display object information about OSM nodes, ways, or relations in web browser."),
-                Shortcut.registerShortcut("core:infoweb",
-                        tr("Advanced info (web)"), KeyEvent.VK_I, Shortcut.CTRL_SHIFT),
-                true, "action/infoweb", true);
+        super(true);
+        setName(tr("Advanced info (web)"));
+        setIcon("info");
+        setShortcut(Shortcut.registerShortcut("core:infoweb", tr("Advanced info (web)"), KeyEvent.VK_I, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Display object information about OSM nodes, ways, or relations in web browser."));
+        registerInToolbar("action/infoweb");
         setHelpId(ht("/Action/InfoAboutElementsWeb"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
index 2f9bf7ee0..a5e04ffb4 100644
--- a/src/org/openstreetmap/josm/actions/JoinAreasAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
@@ -466,9 +466,16 @@ public JoinAreasAction() {
      * @since 11611
      */
     public JoinAreasAction(boolean addShortcutToolbarAdapters) {
-        super(tr("Join overlapping Areas"), "joinareas", tr("Joins areas that overlap each other"), addShortcutToolbarAdapters ?
-        Shortcut.registerShortcut("tools:joinareas", tr("Tool: {0}", tr("Join overlapping Areas")), KeyEvent.VK_J, Shortcut.SHIFT)
-        : null, addShortcutToolbarAdapters, null, addShortcutToolbarAdapters);
+        super(addShortcutToolbarAdapters);
+        setName(tr("Join overlapping Areas"));
+        setIcon("joinareas");
+        setTooltip(tr("Joins areas that overlap each other"));
+        setToolbarId("joinareas");
+        if (addShortcutToolbarAdapters) {
+            setShortcut(Shortcut.registerShortcut("tools:joinareas", tr("Tool: {0}", tr("Join overlapping Areas")),
+                    KeyEvent.VK_J, Shortcut.SHIFT));
+            registerInToolbar("joinareas");
+        }
         addUndoRedo = addShortcutToolbarAdapters;
     }
 
diff --git a/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java b/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
index 8f4180fa5..4c15f90bf 100644
--- a/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
@@ -52,9 +52,7 @@
 
     protected final boolean joinWayToNode;
 
-    protected JoinNodeWayAction(boolean joinWayToNode, String name, String iconName, String tooltip,
-            Shortcut shortcut, boolean registerInToolbar) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar);
+    protected JoinNodeWayAction(boolean joinWayToNode) {
         this.joinWayToNode = joinWayToNode;
     }
 
@@ -63,11 +61,13 @@ protected JoinNodeWayAction(boolean joinWayToNode, String name, String iconName,
      * @return the Join Node to Way action
      */
     public static JoinNodeWayAction createJoinNodeToWayAction() {
-        JoinNodeWayAction action = new JoinNodeWayAction(false,
-                tr("Join Node to Way"), /* ICON */ "joinnodeway",
-                tr("Include a node into the nearest way segments"),
-                Shortcut.registerShortcut("tools:joinnodeway", tr("Tool: {0}", tr("Join Node to Way")),
-                        KeyEvent.VK_J, Shortcut.DIRECT), true);
+        JoinNodeWayAction action = new JoinNodeWayAction(false);
+        action.setName(tr("Join Node to Way"));
+        action.setIcon(/* ICON */ "joinnodeway");
+        action.setShortcut(Shortcut.registerShortcut("tools:joinnodeway", tr("Tool: {0}", tr("Join Node to Way")),
+                KeyEvent.VK_J, Shortcut.DIRECT));
+        action.setTooltip(tr("Include a node into the nearest way segments"));
+        action.registerInToolbar("joinnodeway");
         action.setHelpId(ht("/Action/JoinNodeWay"));
         return action;
     }
@@ -77,11 +77,13 @@ public static JoinNodeWayAction createJoinNodeToWayAction() {
      * @return the Move Node onto Way action
      */
     public static JoinNodeWayAction createMoveNodeOntoWayAction() {
-        JoinNodeWayAction action = new JoinNodeWayAction(true,
-                tr("Move Node onto Way"), /* ICON*/ "movenodeontoway",
-                tr("Move the node onto the nearest way segments and include it"),
-                Shortcut.registerShortcut("tools:movenodeontoway", tr("Tool: {0}", tr("Move Node onto Way")),
-                        KeyEvent.VK_N, Shortcut.DIRECT), true);
+        JoinNodeWayAction action = new JoinNodeWayAction(true);
+        action.setName(tr("Move Node onto Way"));
+        action.setIcon(/* ICON*/ "movenodeontoway");
+        action.setShortcut(Shortcut.registerShortcut("tools:movenodeontoway", tr("Tool: {0}", tr("Move Node onto Way")),
+                KeyEvent.VK_N, Shortcut.DIRECT));
+        action.setTooltip(tr("Move the node onto the nearest way segments and include it"));
+        action.registerInToolbar("movenodeontoway");
         action.setHelpId(ht("/Action/MoveNodeWay"));
         return action;
     }
diff --git a/src/org/openstreetmap/josm/actions/JosmAction.java b/src/org/openstreetmap/josm/actions/JosmAction.java
index 3a5b8bc69..107e6f40b 100644
--- a/src/org/openstreetmap/josm/actions/JosmAction.java
+++ b/src/org/openstreetmap/josm/actions/JosmAction.java
@@ -6,7 +6,6 @@
 import java.awt.GridBagLayout;
 import java.awt.event.KeyEvent;
 import java.util.Collection;
-import java.util.List;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -31,6 +30,7 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
+import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
 import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.tools.Destroyable;
@@ -77,36 +77,21 @@
      * @param registerInToolbar register this action for the toolbar preferences?
      * @param toolbarId identifier for the toolbar preferences
      * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     * @deprecated use {@link #JosmAction(boolean)} and setters
      */
+    @Deprecated
     public JosmAction(String name, ImageProvider icon, String tooltip, Shortcut shortcut, boolean registerInToolbar,
             String toolbarId, boolean installAdapters) {
-        super(name);
-        if (icon != null) {
-            ImageResource resource = icon.getResource();
-            if (resource != null) {
-                try {
-                    resource.attachImageIcon(this, true);
-                } catch (RuntimeException e) {
-                    Logging.warn("Unable to attach image icon {0} for action {1}", icon, name);
-                    Logging.error(e);
-                }
-            }
-        }
-        setHelpId();
-        sc = shortcut;
-        if (sc != null && !sc.isAutomatic()) {
-            MainApplication.registerActionShortcut(this, sc);
-        }
+        this(installAdapters);
+        setName(name);
+        setIcon(icon);
+        setShortcut(shortcut);
         setTooltip(tooltip);
-        if (getValue("toolbar") == null) {
+        if (toolbarId != null && registerInToolbar) {
+            registerInToolbar(toolbarId);
+        } else if (toolbarId != null) {
             setToolbarId(toolbarId);
         }
-        if (registerInToolbar && MainApplication.getToolbar() != null) {
-            MainApplication.getToolbar().register(this);
-        }
-        if (installAdapters) {
-            installAdapters();
-        }
     }
 
     /**
@@ -125,11 +110,21 @@ public JosmAction(String name, ImageProvider icon, String tooltip, Shortcut shor
      * @param registerInToolbar register this action for the toolbar preferences?
      * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
      * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     * @deprecated use {@link #JosmAction(boolean)} and setters
      */
+    @Deprecated
     public JosmAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar,
             String toolbarId, boolean installAdapters) {
-        this(name, iconName == null ? null : new ImageProvider(iconName).setOptional(true), tooltip, shortcut, registerInToolbar,
-                toolbarId == null ? iconName : toolbarId, installAdapters);
+        this(installAdapters);
+        setName(name);
+        setIcon(iconName);
+        setShortcut(shortcut);
+        setTooltip(tooltip);
+        if (registerInToolbar) {
+            registerInToolbar(toolbarId == null ? iconName : toolbarId);
+        } else {
+            setToolbarId(toolbarId == null ? iconName : toolbarId);
+        }
     }
 
     /**
@@ -147,9 +142,20 @@ public JosmAction(String name, String iconName, String tooltip, Shortcut shortcu
      *            the user CANNOT configure a shortcut for your action.
      * @param registerInToolbar register this action for the toolbar preferences?
      * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     * @deprecated use {@link #JosmAction(boolean)} and setters
      */
+    @Deprecated
     public JosmAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar, boolean installAdapters) {
-        this(name, iconName, tooltip, shortcut, registerInToolbar, null, installAdapters);
+        this(installAdapters);
+        setName(name);
+        setIcon(iconName);
+        setShortcut(shortcut);
+        setTooltip(tooltip);
+        if (registerInToolbar) {
+            registerInToolbar(iconName);
+        } else {
+            setToolbarId(iconName);
+        }
     }
 
     /**
@@ -166,9 +172,19 @@ public JosmAction(String name, String iconName, String tooltip, Shortcut shortcu
      *            won't be assigned a shortcut unless the user configures one. If you pass null here,
      *            the user CANNOT configure a shortcut for your action.
      * @param registerInToolbar register this action for the toolbar preferences?
+     * @deprecated use setters
      */
+    @Deprecated
     public JosmAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
-        this(name, iconName, tooltip, shortcut, registerInToolbar, null, true);
+        setName(name);
+        setIcon(iconName);
+        setShortcut(shortcut);
+        setTooltip(tooltip);
+        if (registerInToolbar) {
+            registerInToolbar(iconName);
+        } else {
+            setToolbarId(iconName);
+        }
     }
 
     /**
@@ -182,6 +198,13 @@ public JosmAction() {
      * Constructs a new {@code JosmAction}.
      *
      * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     * @see #setName(String)
+     * @see #setIcon(String)
+     * @see #setIcon(ImageProvider)
+     * @see #setShortcut(Shortcut)
+     * @see #setTooltip(String)
+     * @see #setHelpId(String)
+     * @see #registerInToolbar(String)
      */
     public JosmAction(boolean installAdapters) {
         setHelpId();
@@ -191,21 +214,69 @@ public JosmAction(boolean installAdapters) {
     }
 
     /**
-     * Constructs a new {@code JosmAction}.
-     *
-     * Use this super constructor to setup your action.
-     *
+     * Sets the name
      * @param name the action's text as displayed on the menu (if it is added to a menu)
+     */
+    protected final void setName(String name) {
+        putValue(NAME, name);
+    }
+
+    /**
+     * Sets the toolbar identifier and registers this action in the toolbar
+     *
+     * @param toolbarId identifier for the toolbar preferences
+     * @see ToolbarPreferences#register(javax.swing.Action)
+     */
+    protected final void registerInToolbar(String toolbarId) {
+        setToolbarId(toolbarId);
+        if (MainApplication.getToolbar() != null) {
+            MainApplication.getToolbar().register(this);
+        }
+    }
+
+    /**
+     * Sets the shortcut
+     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
+     *                 do want a shortcut, remember you can always register it with group=none, so you
+     *                 won't be assigned a shortcut unless the user configures one. If you pass null here,
+     *                 the user CANNOT configure a shortcut for your action.
+     */
+    protected final void setShortcut(Shortcut shortcut) {
+        sc = shortcut;
+        if (sc != null && !sc.isAutomatic()) {
+            MainApplication.registerActionShortcut(this, sc);
+        }
+    }
+
+    /**
+     * Sets the icon name
      * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcuts ready-created shortcut objects
-     * @since 14012
      */
-    public JosmAction(String name, String iconName, String tooltip, List<Shortcut> shortcuts) {
-        this(name, iconName, tooltip, shortcuts.get(0), true, null, true);
-        for (int i = 1; i < shortcuts.size(); i++) {
-            MainApplication.registerActionShortcut(this, shortcuts.get(i));
+    protected final void setIcon(String iconName) {
+        if (iconName == null) {
+            return;
+        }
+        ImageProvider icon = new ImageProvider(iconName).setOptional(true);
+        setIcon(icon);
+    }
+
+    /**
+     * Sets the icon
+     * @param icon the icon to use
+     */
+    protected final void setIcon(ImageProvider icon) {
+        if (icon == null) {
+            return;
+        }
+        ImageResource resource = icon.getResource();
+        if (resource == null) {
+            return;
+        }
+        try {
+            resource.attachImageIcon(this, true);
+        } catch (RuntimeException e) {
+            Logging.warn("Unable to attach image icon {0} for action {1}", icon, getValue(NAME));
+            Logging.error(e);
         }
     }
 
@@ -304,6 +375,7 @@ protected void setHelpId(String helpId) {
     /**
      * Sets the toolbar id.
      * @param toolbarId toolbar id
+     * @see #registerInToolbar(String)
      * @since 16138
      */
     protected void setToolbarId(String toolbarId) {
@@ -326,6 +398,7 @@ public Shortcut getShortcut() {
 
     /**
      * Sets the tooltip text of this action.
+     * Make sure to call {@link #setShortcut(Shortcut)} first to have the shortcut included in the tooltip.
      * @param tooltip The text to display in tooltip. Can be {@code null}
      */
     public final void setTooltip(String tooltip) {
diff --git a/src/org/openstreetmap/josm/actions/JumpToAction.java b/src/org/openstreetmap/josm/actions/JumpToAction.java
index 313d86a6e..90280b6ac 100644
--- a/src/org/openstreetmap/josm/actions/JumpToAction.java
+++ b/src/org/openstreetmap/josm/actions/JumpToAction.java
@@ -32,7 +32,6 @@
 import org.openstreetmap.josm.io.NameFinder;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -53,9 +52,11 @@
      * Constructs a new {@code JumpToAction}.
      */
     public JumpToAction() {
-        super(tr("Jump to Position"), (ImageProvider) null, tr("Opens a dialog that allows to jump to a specific location"),
-                Shortcut.registerShortcut("tools:jumpto", tr("Tool: {0}", tr("Jump to Position")),
-                        KeyEvent.VK_J, Shortcut.CTRL), true, "action/jumpto", false);
+        setName(tr("Jump to Position"));
+        setShortcut(Shortcut.registerShortcut("tools:jumpto", tr("Tool: {0}", tr("Jump to Position")),
+                        KeyEvent.VK_J, Shortcut.CTRL));
+        setTooltip(tr("Opens a dialog that allows to jump to a specific location"));
+        registerInToolbar("action/jumpto");
         // make this action listen to mapframe change events
         MainApplication.addMapFrameListener((o, n) -> updateEnabledState());
 
diff --git a/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java b/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java
index eff64286a..b919ae395 100644
--- a/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java
+++ b/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java
@@ -80,14 +80,12 @@ private boolean isSelected() {
      * Constructs a new {@code MapRectifierWMSmenuAction}.
      */
     public MapRectifierWMSmenuAction() {
-        super(tr("Rectified Image..."),
-                "OLmarker",
-                tr("Download Rectified Images From Various Services"),
-                Shortcut.registerShortcut("imagery:rectimg",
-                        tr("Imagery: {0}", tr("Rectified Image...")),
-                        KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
-                true
-        );
+        setName(tr("Rectified Image..."));
+        setIcon("OLmarker");
+        setShortcut(Shortcut.registerShortcut("imagery:rectimg", tr("Imagery: {0}", tr("Rectified Image...")),
+                KeyEvent.CHAR_UNDEFINED, Shortcut.NONE));
+        setTooltip(tr("Download Rectified Images From Various Services"));
+        registerInToolbar("OLmarker");
         setHelpId(ht("/Menu/Imagery"));
 
         // Add default services
diff --git a/src/org/openstreetmap/josm/actions/MergeLayerAction.java b/src/org/openstreetmap/josm/actions/MergeLayerAction.java
index a12634d19..8403e5e63 100644
--- a/src/org/openstreetmap/josm/actions/MergeLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeLayerAction.java
@@ -36,11 +36,11 @@
      * Constructs a new {@code MergeLayerAction}.
      */
     public MergeLayerAction() {
-        super(tr("Merge layer"), "dialogs/mergedown",
-            tr("Merge the current layer into another layer"),
-            Shortcut.registerShortcut("system:merge", tr("Edit: {0}",
-            tr("Merge")), KeyEvent.VK_M, Shortcut.CTRL),
-            true, "action/mergelayer", true);
+        setName(tr("Merge layer"));
+        setIcon("dialogs/mergedown");
+        setShortcut(Shortcut.registerShortcut("system:merge", tr("Edit: {0}", tr("Merge")), KeyEvent.VK_M, Shortcut.CTRL));
+        setTooltip(tr("Merge the current layer into another layer"));
+        registerInToolbar("action/mergelayer");
         setHelpId(ht("/Action/MergeLayer"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/MergeNodesAction.java b/src/org/openstreetmap/josm/actions/MergeNodesAction.java
index a48b2d245..09e2467ad 100644
--- a/src/org/openstreetmap/josm/actions/MergeNodesAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeNodesAction.java
@@ -66,8 +66,11 @@
      * Constructs a new {@code MergeNodesAction}.
      */
     public MergeNodesAction() {
-        super(tr("Merge Nodes"), "mergenodes", tr("Merge nodes into the oldest one."),
-                Shortcut.registerShortcut("tools:mergenodes", tr("Tool: {0}", tr("Merge Nodes")), KeyEvent.VK_M, Shortcut.DIRECT), true);
+        setName(tr("Merge Nodes"));
+        setIcon("mergenodes");
+        setShortcut(Shortcut.registerShortcut("tools:mergenodes", tr("Tool: {0}", tr("Merge Nodes")), KeyEvent.VK_M, Shortcut.DIRECT));
+        setTooltip(tr("Merge nodes into the oldest one."));
+        registerInToolbar("mergenodes");
         setHelpId(ht("/Action/MergeNodes"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/MergeSelectionAction.java b/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
index 7e33b4f9a..29a69bd52 100644
--- a/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
@@ -29,11 +29,12 @@
      * Constructs a new {@code MergeSelectionAction}.
      */
     public MergeSelectionAction() {
-        super(tr("Merge selection"), "dialogs/mergedown", tr("Merge the currently selected objects into another layer"),
-            Shortcut.registerShortcut("system:mergeselection", tr("Edit: {0}", tr("Merge selection")),
-            KeyEvent.VK_M, Shortcut.CTRL_SHIFT),
-            true /* register */
-        );
+        setName(tr("Merge selection"));
+        setIcon("dialogs/mergedown");
+        setShortcut(Shortcut.registerShortcut("system:mergeselection", tr("Edit: {0}", tr("Merge selection")),
+                KeyEvent.VK_M, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Merge the currently selected objects into another layer"));
+        registerInToolbar("dialogs/mergedown");
         setHelpId(ht("/Action/MergeSelection"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/MirrorAction.java b/src/org/openstreetmap/josm/actions/MirrorAction.java
index 8d152151c..031cfaff4 100644
--- a/src/org/openstreetmap/josm/actions/MirrorAction.java
+++ b/src/org/openstreetmap/josm/actions/MirrorAction.java
@@ -36,9 +36,11 @@
      * Constructs a new {@code MirrorAction}.
      */
     public MirrorAction() {
-        super(tr("Mirror"), "mirror", tr("Mirror selected nodes and ways."),
-                Shortcut.registerShortcut("tools:mirror", tr("Tool: {0}", tr("Mirror")),
-                        KeyEvent.VK_M, Shortcut.SHIFT), true);
+        setName(tr("Mirror"));
+        setIcon("mirror");
+        setShortcut(Shortcut.registerShortcut("tools:mirror", tr("Tool: {0}", tr("Mirror")), KeyEvent.VK_M, Shortcut.SHIFT));
+        setTooltip(tr("Mirror selected nodes and ways."));
+        registerInToolbar("mirror");
         setHelpId(ht("/Action/Mirror"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/MoveAction.java b/src/org/openstreetmap/josm/actions/MoveAction.java
index 568341ee4..02d0cbf1f 100644
--- a/src/org/openstreetmap/josm/actions/MoveAction.java
+++ b/src/org/openstreetmap/josm/actions/MoveAction.java
@@ -89,9 +89,11 @@ Shortcut getShortcut() {
      * @param dir direction
      */
     public MoveAction(Direction dir) {
-        super(tr("Move {0}", dir.getLocalizedName()), dir.getIcon(),
-                tr("Moves Objects {0}", dir.getLocalizedName()),
-                dir.getShortcut(), true, dir.getToolbarName(), true);
+        setName(tr("Move {0}", dir.getLocalizedName()));
+        setIcon(dir.getIcon());
+        setShortcut(dir.getShortcut());
+        setTooltip(tr("Moves Objects {0}", dir.getLocalizedName()));
+        registerInToolbar(dir.getToolbarName());
         myDirection = dir;
         setHelpId(ht("/Action/Move"));
     }
diff --git a/src/org/openstreetmap/josm/actions/MoveNodeAction.java b/src/org/openstreetmap/josm/actions/MoveNodeAction.java
index edffab05e..7364331fa 100644
--- a/src/org/openstreetmap/josm/actions/MoveNodeAction.java
+++ b/src/org/openstreetmap/josm/actions/MoveNodeAction.java
@@ -28,9 +28,11 @@
      * Constructs a new {@code MoveNodeAction}.
      */
     public MoveNodeAction() {
-        super(tr("Move Node..."), "movenode", tr("Edit latitude and longitude of a node."),
-                Shortcut.registerShortcut("movenode", tr("Edit: {0}", tr("Move Node...")),
-                        KeyEvent.VK_M, Shortcut.NONE), true);
+        setName(tr("Move Node..."));
+        setIcon("movenode");
+        setShortcut(Shortcut.registerShortcut("movenode", tr("Edit: {0}", tr("Move Node...")), KeyEvent.VK_M, Shortcut.NONE));
+        setTooltip(tr("Edit latitude and longitude of a node."));
+        registerInToolbar("movenode");
         setHelpId(ht("/Action/MoveNode"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/NewAction.java b/src/org/openstreetmap/josm/actions/NewAction.java
index 21861d375..9f512689b 100644
--- a/src/org/openstreetmap/josm/actions/NewAction.java
+++ b/src/org/openstreetmap/josm/actions/NewAction.java
@@ -21,8 +21,12 @@
      * Constructs a {@code NewAction}.
      */
     public NewAction() {
-        super(tr("New Layer"), "new", tr("Create a new map layer."),
-                Shortcut.registerShortcut("system:new", tr("File: {0}", tr("New Layer")), KeyEvent.VK_N, Shortcut.CTRL), true, false);
+        super(false);
+        setName(tr("New Layer"));
+        setIcon("new");
+        setShortcut(Shortcut.registerShortcut("system:new", tr("File: {0}", tr("New Layer")), KeyEvent.VK_N, Shortcut.CTRL));
+        setTooltip(tr("Create a new map layer."));
+        registerInToolbar("new");
         setHelpId(ht("/Action/NewLayer"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/OpenFileAction.java b/src/org/openstreetmap/josm/actions/OpenFileAction.java
index 5e5f4d028..1599f7955 100644
--- a/src/org/openstreetmap/josm/actions/OpenFileAction.java
+++ b/src/org/openstreetmap/josm/actions/OpenFileAction.java
@@ -65,9 +65,12 @@
      * Create an open action. The name is "Open a file".
      */
     public OpenFileAction() {
-        super(tr("Open..."), "open", tr("Open a file."),
-                Shortcut.registerShortcut("system:open", tr("File: {0}", tr("Open...")), KeyEvent.VK_O, Shortcut.CTRL),
-                true, null, false);
+        super(false);
+        setName(tr("Open..."));
+        setIcon("open");
+        setShortcut(Shortcut.registerShortcut("system:open", tr("File: {0}", tr("Open...")), KeyEvent.VK_O, Shortcut.CTRL));
+        setTooltip(tr("Open a file."));
+        registerInToolbar("open");
         setHelpId(ht("/Action/Open"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/OpenLocationAction.java b/src/org/openstreetmap/josm/actions/OpenLocationAction.java
index 823f57103..34ca98127 100644
--- a/src/org/openstreetmap/josm/actions/OpenLocationAction.java
+++ b/src/org/openstreetmap/josm/actions/OpenLocationAction.java
@@ -83,10 +83,13 @@
      * Create an open action. The name is "Open a file".
      */
     public OpenLocationAction() {
+        super(false);
         /* I18N: Command to download a specific location/URL */
-        super(tr("Open Location..."), "openlocation", tr("Open an URL."),
-                Shortcut.registerShortcut("system:open_location", tr("File: {0}", tr("Open Location...")),
-                        KeyEvent.VK_L, Shortcut.CTRL), true, false);
+        setName(tr("Open Location..."));
+        setIcon("openlocation");
+        setShortcut(Shortcut.registerShortcut("system:open_location", tr("File: {0}", tr("Open Location...")), KeyEvent.VK_L, Shortcut.CTRL));
+        setTooltip(tr("Open an URL."));
+        registerInToolbar("openlocation");
         setHelpId(ht("/Action/OpenLocation"));
         this.downloadTasks = new ArrayList<>();
         addDownloadTaskClass(DownloadOsmTask.class);
diff --git a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
index 2500af15d..12dba64a7 100644
--- a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
+++ b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
@@ -60,12 +60,12 @@
      * Constructs a new {@code OrthogonalizeAction}.
      */
     public OrthogonalizeAction() {
-        super(tr("Orthogonalize Shape"),
-                "ortho",
-                tr("Move nodes so all angles are 90 or 180 degrees"),
-                Shortcut.registerShortcut("tools:orthogonalize", tr("Tool: {0}", tr("Orthogonalize Shape")),
-                        KeyEvent.VK_Q,
-                        Shortcut.DIRECT), true);
+        setName(tr("Orthogonalize Shape"));
+        setIcon("ortho");
+        setShortcut(Shortcut.registerShortcut("tools:orthogonalize", tr("Tool: {0}", tr("Orthogonalize Shape")),
+                KeyEvent.VK_Q, Shortcut.DIRECT));
+        setTooltip(tr("Move nodes so all angles are 90 or 180 degrees"));
+        registerInToolbar("ortho");
         setHelpId(ht("/Action/OrthogonalizeShape"));
     }
 
@@ -96,12 +96,12 @@ public OrthogonalizeAction() {
          * Constructor
          */
         public Undo() {
-            super(tr("Orthogonalize Shape / Undo"), "ortho",
-                    tr("Undo orthogonalization for certain nodes"),
-                    Shortcut.registerShortcut("tools:orthogonalizeUndo", tr("Tool: {0}", tr("Orthogonalize Shape / Undo")),
-                            KeyEvent.VK_Q,
-                            Shortcut.SHIFT),
-                    true, "action/orthogonalize/undo", true);
+            setName(tr("Orthogonalize Shape / Undo"));
+            setIcon("ortho");
+            setShortcut(Shortcut.registerShortcut("tools:orthogonalizeUndo", tr("Tool: {0}", tr("Orthogonalize Shape / Undo")),
+                    KeyEvent.VK_Q, Shortcut.SHIFT));
+            setTooltip(tr("Undo orthogonalization for certain nodes"));
+            registerInToolbar("action/orthogonalize/undo");
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/actions/PasteAction.java b/src/org/openstreetmap/josm/actions/PasteAction.java
index 960ee45b5..0374c1cfa 100644
--- a/src/org/openstreetmap/josm/actions/PasteAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteAction.java
@@ -20,8 +20,11 @@
      * Constructs a new {@code PasteAction}.
      */
     public PasteAction() {
-        super(tr("Paste"), "paste", tr("Paste contents of clipboard."),
-                Shortcut.registerShortcut("system:paste", tr("Edit: {0}", tr("Paste")), KeyEvent.VK_V, Shortcut.CTRL), true);
+        setName(tr("Paste"));
+        setIcon("paste");
+        setShortcut(Shortcut.registerShortcut("system:paste", tr("Edit: {0}", tr("Paste")), KeyEvent.VK_V, Shortcut.CTRL));
+        setTooltip(tr("Paste contents of clipboard."));
+        registerInToolbar("paste");
         setHelpId(ht("/Action/Paste"));
         // CUA shortcut for paste (https://en.wikipedia.org/wiki/IBM_Common_User_Access#Description)
         MainApplication.registerActionShortcut(this,
diff --git a/src/org/openstreetmap/josm/actions/PasteAtSourcePositionAction.java b/src/org/openstreetmap/josm/actions/PasteAtSourcePositionAction.java
index 70ddb2d11..839f4e716 100644
--- a/src/org/openstreetmap/josm/actions/PasteAtSourcePositionAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteAtSourcePositionAction.java
@@ -21,9 +21,12 @@
      * Constructs a new {@link PasteAtSourcePositionAction}.
      */
     public PasteAtSourcePositionAction() {
-        super(tr("Paste at source position"), "paste", tr("Paste contents of clipboard at the position they were copied from."),
-                Shortcut.registerShortcut("menu:edit:pasteAtSource", tr("Edit: {0}", tr("Paste at source position")),
-                        KeyEvent.VK_V, Shortcut.ALT_CTRL), true, "pasteatsource");
+        setName(tr("Paste at source position"));
+        setIcon("paste");
+        setShortcut(Shortcut.registerShortcut("menu:edit:pasteAtSource", tr("Edit: {0}", tr("Paste at source position")),
+                KeyEvent.VK_V, Shortcut.ALT_CTRL));
+        setTooltip(tr("Paste contents of clipboard at the position they were copied from."));
+        registerInToolbar("pasteatsource");
         setHelpId(ht("/Action/Paste"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/PasteTagsAction.java b/src/org/openstreetmap/josm/actions/PasteTagsAction.java
index 48beb83b9..e426724f8 100644
--- a/src/org/openstreetmap/josm/actions/PasteTagsAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteTagsAction.java
@@ -29,10 +29,11 @@
      * Constructs a new {@code PasteTagsAction}.
      */
     public PasteTagsAction() {
-        super(tr("Paste Tags"), "pastetags",
-                tr("Apply tags of contents of paste buffer to all selected items."),
-                Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")),
-                KeyEvent.VK_V, Shortcut.CTRL_SHIFT), true);
+        setName(tr("Paste Tags"));
+        setIcon("pastetags");
+        setShortcut(Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")), KeyEvent.VK_V, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Apply tags of contents of paste buffer to all selected items."));
+        registerInToolbar("pastetags");
         setHelpId(HELP);
     }
 
diff --git a/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java b/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java
index 3bf6ff91d..9d79069af 100644
--- a/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java
@@ -28,7 +28,8 @@
      * @param pref the preference to toggle
      */
     public PreferenceToggleAction(String name, String tooltip, BooleanProperty pref) {
-        super(name, null, tooltip, null, false);
+        setName(name);
+        setTooltip(tooltip);
         setToolbarId("toggle-" + pref.getKey());
         this.pref = pref;
         checkbox = new JCheckBoxMenuItem(this);
diff --git a/src/org/openstreetmap/josm/actions/PreferencesAction.java b/src/org/openstreetmap/josm/actions/PreferencesAction.java
index 471174309..80d282faf 100644
--- a/src/org/openstreetmap/josm/actions/PreferencesAction.java
+++ b/src/org/openstreetmap/josm/actions/PreferencesAction.java
@@ -27,7 +27,11 @@
 
     private PreferencesAction(String name, String icon, String tooltip,
                               Class<? extends TabPreferenceSetting> tab, Class<? extends SubPreferenceSetting> subTab) {
-        super(name, icon, tooltip, null, false, "preference_" + Utils.<Class<?>>firstNonNull(tab, subTab).getName(), false);
+        super(false);
+        setName(name);
+        setIcon(icon);
+        setTooltip(tooltip);
+        setToolbarId("preference_" + Utils.<Class<?>>firstNonNull(tab, subTab).getName());
         this.tab = tab;
         this.subTab = subTab;
     }
@@ -86,8 +90,12 @@ public static PreferencesAction forPreferenceSubTab(String name, String tooltip,
      * Create the preference action with "Preferences" as label.
      */
     public PreferencesAction() {
-        super(tr("Preferences..."), "preference", tr("Open a preferences dialog for global settings."),
-                Shortcut.registerShortcut("system:preferences", tr("Preferences"), KeyEvent.VK_F12, Shortcut.DIRECT), true, false);
+        super(false);
+        setName(tr("Preferences..."));
+        setIcon("preference");
+        setShortcut(Shortcut.registerShortcut("system:preferences", tr("Preferences"), KeyEvent.VK_F12, Shortcut.DIRECT));
+        setTooltip(tr("Open a preferences dialog for global settings."));
+        registerInToolbar("preference");
         setHelpId(ht("/Action/Preferences"));
         this.tab = null;
         this.subTab = null;
diff --git a/src/org/openstreetmap/josm/actions/PurgeAction.java b/src/org/openstreetmap/josm/actions/PurgeAction.java
index c3305bb51..59fae99c8 100644
--- a/src/org/openstreetmap/josm/actions/PurgeAction.java
+++ b/src/org/openstreetmap/josm/actions/PurgeAction.java
@@ -69,9 +69,11 @@
      */
     public PurgeAction() {
         /* translator note: other expressions for "purge" might be "forget", "clean", "obliterate", "prune" */
-        super(tr("Purge..."), "purge", tr("Forget objects but do not delete them on server when uploading."),
-                Shortcut.registerShortcut("system:purge", tr("Edit: {0}", tr("Purge")), KeyEvent.VK_P, Shortcut.CTRL_SHIFT),
-                true);
+        setName(tr("Purge..."));
+        setIcon("purge");
+        setShortcut(Shortcut.registerShortcut("system:purge", tr("Edit: {0}", tr("Purge")), KeyEvent.VK_P, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Forget objects but do not delete them on server when uploading."));
+        registerInToolbar("purge");
         setHelpId(HelpUtil.ht("/Action/Purge"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/RedoAction.java b/src/org/openstreetmap/josm/actions/RedoAction.java
index 36284fb81..66443cd2c 100644
--- a/src/org/openstreetmap/josm/actions/RedoAction.java
+++ b/src/org/openstreetmap/josm/actions/RedoAction.java
@@ -24,8 +24,11 @@
      * Construct the action with "Redo" as label.
      */
     public RedoAction() {
-        super(tr("Redo"), "redo", tr("Redo the last undone action."),
-                Shortcut.registerShortcut("system:redo", tr("Edit: {0}", tr("Redo")), KeyEvent.VK_Y, Shortcut.CTRL), true);
+        setName(tr("Redo"));
+        setIcon("redo");
+        setShortcut(Shortcut.registerShortcut("system:redo", tr("Edit: {0}", tr("Redo")), KeyEvent.VK_Y, Shortcut.CTRL));
+        setTooltip(tr("Redo the last undone action."));
+        registerInToolbar("redo");
         setEnabled(false);
         setHelpId(ht("/Action/Redo"));
     }
diff --git a/src/org/openstreetmap/josm/actions/ReorderImageryLayersAction.java b/src/org/openstreetmap/josm/actions/ReorderImageryLayersAction.java
index 0013696be..efbd21fa9 100644
--- a/src/org/openstreetmap/josm/actions/ReorderImageryLayersAction.java
+++ b/src/org/openstreetmap/josm/actions/ReorderImageryLayersAction.java
@@ -8,6 +8,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.tools.KeyboardUtils;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -22,9 +23,16 @@
      * Constructs a new {@code ReorderImageryLayersAction}.
      */
     public ReorderImageryLayersAction() {
-        super(tr("Reorder imagery layers"), "dialogs/reorderlayers", tr("Reorders non-overlay imagery layers."),
-            Shortcut.registerMultiShortcuts("imagery:reorder", tr("Reorder imagery layers"),
-                    KeyboardUtils.getCharactersForKey('E', 0), Shortcut.DIRECT));
+        setName(tr("Reorder imagery layers"));
+        setIcon("dialogs/reorderlayers");
+        setTooltip(tr("Reorders non-overlay imagery layers."));
+        registerInToolbar("dialogs/reorderlayers");
+        List<Shortcut> shortcuts = Shortcut.registerMultiShortcuts("imagery:reorder", tr("Reorder imagery layers"),
+                KeyboardUtils.getCharactersForKey('E', 0), Shortcut.DIRECT);
+        setShortcut(shortcuts.get(0));
+        for (int i = 1; i < shortcuts.size(); i++) {
+            MainApplication.registerActionShortcut(this, shortcuts.get(i));
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/ReportBugAction.java b/src/org/openstreetmap/josm/actions/ReportBugAction.java
index 336fb37ce..e5105880c 100644
--- a/src/org/openstreetmap/josm/actions/ReportBugAction.java
+++ b/src/org/openstreetmap/josm/actions/ReportBugAction.java
@@ -29,9 +29,12 @@ public ReportBugAction() {
      * @param text The text to send
      */
     public ReportBugAction(String text) {
-        super(tr("Report bug"), "bug", tr("Report a ticket to JOSM bugtracker"),
-                Shortcut.registerShortcut("reportbug", tr("Report a ticket to JOSM bugtracker"),
-                        KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), true, false);
+        super(false);
+        setName(tr("Report bug"));
+        setIcon("bug");
+        setShortcut(Shortcut.registerShortcut("reportbug", tr("Report a ticket to JOSM bugtracker"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE));
+        setTooltip(tr("Report a ticket to JOSM bugtracker"));
+        registerInToolbar("bug");
         this.text = text;
     }
 
diff --git a/src/org/openstreetmap/josm/actions/RestartAction.java b/src/org/openstreetmap/josm/actions/RestartAction.java
index 7d35582bd..830d7b071 100644
--- a/src/org/openstreetmap/josm/actions/RestartAction.java
+++ b/src/org/openstreetmap/josm/actions/RestartAction.java
@@ -47,13 +47,14 @@
      * Constructs a new {@code RestartAction}.
      */
     public RestartAction() {
-        super(tr("Restart"), "restart", tr("Restart the application."),
-                Shortcut.registerShortcut("file:restart", tr("File: {0}", tr("Restart")), KeyEvent.VK_J, Shortcut.ALT_CTRL_SHIFT), false, false);
+        super(false);
+        setName(tr("Restart"));
+        setIcon("restart");
+        setShortcut(Shortcut.registerShortcut("file:restart", tr("File: {0}", tr("Restart")), KeyEvent.VK_J, Shortcut.ALT_CTRL_SHIFT));
+        setTooltip(tr("Restart the application."));
+        setToolbarId("restart");
         setHelpId(ht("/Action/Restart"));
-        setToolbarId("action/restart");
-        if (MainApplication.getToolbar() != null) {
-            MainApplication.getToolbar().register(this);
-        }
+        registerInToolbar("action/restart");
         setEnabled(isRestartSupported());
     }
 
diff --git a/src/org/openstreetmap/josm/actions/ReverseWayAction.java b/src/org/openstreetmap/josm/actions/ReverseWayAction.java
index 75d714c4e..f17b275c3 100644
--- a/src/org/openstreetmap/josm/actions/ReverseWayAction.java
+++ b/src/org/openstreetmap/josm/actions/ReverseWayAction.java
@@ -104,8 +104,11 @@ public Command getReverseCommand() {
      * Creates a new {@link ReverseWayAction} and binds the shortcut
      */
     public ReverseWayAction() {
-        super(tr("Reverse Ways"), "wayflip", tr("Reverse the direction of all selected ways."),
-                Shortcut.registerShortcut("tools:reverse", tr("Tool: {0}", tr("Reverse Ways")), KeyEvent.VK_R, Shortcut.DIRECT), true);
+        setName(tr("Reverse Ways"));
+        setIcon("wayflip");
+        setShortcut(Shortcut.registerShortcut("tools:reverse", tr("Tool: {0}", tr("Reverse Ways")), KeyEvent.VK_R, Shortcut.DIRECT));
+        setTooltip(tr("Reverse the direction of all selected ways."));
+        registerInToolbar("wayflip");
         setHelpId(ht("/Action/ReverseWays"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SaveAction.java b/src/org/openstreetmap/josm/actions/SaveAction.java
index 1eb7293df..a6b5b9af7 100644
--- a/src/org/openstreetmap/josm/actions/SaveAction.java
+++ b/src/org/openstreetmap/josm/actions/SaveAction.java
@@ -48,9 +48,12 @@
      * Construct the action with "Save" as label.
      */
     private SaveAction() {
-        super(tr("Save"), "save", tr("Save the current data."),
-                Shortcut.registerShortcut("system:save", tr("File: {0}", tr("Save")), KeyEvent.VK_S, Shortcut.CTRL),
-                true);
+        super(true);
+        setName(tr("Save"));
+        setIcon("save");
+        setShortcut(Shortcut.registerShortcut("system:save", tr("File: {0}", tr("Save")), KeyEvent.VK_S, Shortcut.CTRL));
+        setTooltip(tr("Save the current data."));
+        registerInToolbar("save");
         setHelpId(ht("/Action/Save"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SaveActionBase.java b/src/org/openstreetmap/josm/actions/SaveActionBase.java
index a7df83856..1805b6388 100644
--- a/src/org/openstreetmap/josm/actions/SaveActionBase.java
+++ b/src/org/openstreetmap/josm/actions/SaveActionBase.java
@@ -42,7 +42,9 @@
      * @param iconName The filename of the icon to use
      * @param tooltip A longer description of the action that will be displayed in the tooltip
      * @param shortcut A ready-created shortcut object or {@code null} if you don't want a shortcut
+     * @deprecated use {@link #SaveActionBase(boolean)} and setters
      */
+    @Deprecated
     public SaveActionBase(String name, String iconName, String tooltip, Shortcut shortcut) {
         super(name, iconName, tooltip, shortcut);
     }
@@ -55,12 +57,23 @@ public SaveActionBase(String name, String iconName, String tooltip, Shortcut sho
      * @param shortcut A ready-created shortcut object or {@code null} if you don't want a shortcut
      * @param quiet whether the quiet exporter is called
      * @since 15496
+     * @deprecated use {@link #SaveActionBase(boolean)} and setters
      */
+    @Deprecated
     public SaveActionBase(String name, String iconName, String tooltip, Shortcut shortcut, boolean quiet) {
         super(name, iconName, tooltip, shortcut);
         this.quiet = quiet;
     }
 
+    /**
+     * Constructs a new {@code SaveActionBase}.
+     * @param quiet whether the quiet exporter is called
+     */
+    public SaveActionBase(boolean quiet) {
+        super(true);
+        this.quiet = quiet;
+    }
+
     @Override
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled())
diff --git a/src/org/openstreetmap/josm/actions/SaveAsAction.java b/src/org/openstreetmap/josm/actions/SaveAsAction.java
index 1615711af..676f07045 100644
--- a/src/org/openstreetmap/josm/actions/SaveAsAction.java
+++ b/src/org/openstreetmap/josm/actions/SaveAsAction.java
@@ -22,9 +22,12 @@
      * Construct the action with "Save" as label.
      */
     public SaveAsAction() {
-        super(tr("Save As..."), "save_as", tr("Save the current data to a new file."),
-            Shortcut.registerShortcut("system:saveas", tr("File: {0}", tr("Save As...")),
-            KeyEvent.VK_S, Shortcut.CTRL_SHIFT), false);
+        super(false);
+        setName(tr("Save As..."));
+        setIcon("save_as");
+        setShortcut(Shortcut.registerShortcut("system:saveas", tr("File: {0}", tr("Save As...")), KeyEvent.VK_S, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Save the current data to a new file."));
+        registerInToolbar("save_as");
         setHelpId(ht("/Action/SaveAs"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java b/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
index cdde8b15a..41ec9b00c 100644
--- a/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
+++ b/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
@@ -34,7 +34,11 @@
 
     /** Constructs a new note search action */
     public SearchNotesDownloadAction() {
-        super(tr("Search Notes..."), "note_search", tr("Download notes from the note search API"), null, false, false);
+        super(false);
+        setName(tr("Search Notes..."));
+        setIcon("note_search");
+        setTooltip(tr("Download notes from the note search API"));
+        setToolbarId("note_search");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/SelectAllAction.java b/src/org/openstreetmap/josm/actions/SelectAllAction.java
index b13f057a6..27ed48705 100644
--- a/src/org/openstreetmap/josm/actions/SelectAllAction.java
+++ b/src/org/openstreetmap/josm/actions/SelectAllAction.java
@@ -19,8 +19,11 @@
      * Constructs a new {@code SelectAllAction}.
      */
     public SelectAllAction() {
-        super(tr("Select All"), "selectall", tr("Select all undeleted objects in the data layer. This selects incomplete objects too."),
-                Shortcut.registerShortcut("system:selectall", tr("Edit: {0}", tr("Select All")), KeyEvent.VK_A, Shortcut.CTRL), true);
+        setName(tr("Select All"));
+        setIcon("selectall");
+        setShortcut(Shortcut.registerShortcut("system:selectall", tr("Edit: {0}", tr("Select All")), KeyEvent.VK_A, Shortcut.CTRL));
+        setTooltip(tr("Select all undeleted objects in the data layer. This selects incomplete objects too."));
+        registerInToolbar("selectall");
         setHelpId(ht("/Action/SelectAll"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java b/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java
index c6116a6f2..89b1448ee 100644
--- a/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java
+++ b/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java
@@ -20,11 +20,11 @@
      * Creates a new {@link SelectNonBranchingWaySequencesAction}
      */
     public SelectNonBranchingWaySequencesAction() {
-        super(tr("Non-branching way sequences"),
-                "way-select",
-                tr("Select non-branching sequences of ways"),
-                Shortcut.registerShortcut("wayselector:wayselect", tr("Non-branching way sequences"), KeyEvent.VK_W, Shortcut.SHIFT),
-                true);
+        setName(tr("Non-branching way sequences"));
+        setIcon("way-select");
+        setShortcut(Shortcut.registerShortcut("wayselector:wayselect", tr("Non-branching way sequences"), KeyEvent.VK_W, Shortcut.SHIFT));
+        setTooltip(tr("Select non-branching sequences of ways"));
+        registerInToolbar("way-select");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/SessionLoadAction.java b/src/org/openstreetmap/josm/actions/SessionLoadAction.java
index 491d3764c..58ee5911b 100644
--- a/src/org/openstreetmap/josm/actions/SessionLoadAction.java
+++ b/src/org/openstreetmap/josm/actions/SessionLoadAction.java
@@ -49,7 +49,11 @@
      * Constructs a new {@code SessionLoadAction}.
      */
     public SessionLoadAction() {
-        super(tr("Load Session"), "open", tr("Load a session from file."), null, true, "load-session", true);
+        super(true);
+        setName(tr("Load Session"));
+        setIcon("open");
+        setTooltip(tr("Load a session from file."));
+        registerInToolbar("load-session");
         setHelpId(ht("/Action/SessionLoad"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java b/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
index a34a5aee2..f279284f7 100644
--- a/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
+++ b/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
@@ -72,8 +72,13 @@ public SessionSaveAsAction() {
      * @param installAdapters False, if you don't want to install layer changed and selection changed adapters
      */
     protected SessionSaveAsAction(boolean toolbar, boolean installAdapters) {
-        super(tr("Save Session As..."), "session", tr("Save the current session to a new file."),
-                null, toolbar, "save_as-session", installAdapters);
+        super(installAdapters);
+        setName(tr("Save Session As..."));
+        setIcon("session");
+        if (toolbar) {
+            registerInToolbar("save_as-session");
+        }
+        setTooltip(tr("Save the current session to a new file."));
         setHelpId(ht("/Action/SessionSaveAs"));
         MainApplication.addMapFrameListener(this);
     }
diff --git a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
index 4ae68d504..7c29bd4d4 100644
--- a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
+++ b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
@@ -61,13 +61,13 @@
      * Constructs a new {@code ShowStatusReportAction}
      */
     public ShowStatusReportAction() {
-        super(
-                tr("Show Status Report"),
-                "clock",
-                tr("Show status report with useful information that can be attached to bugs"),
-                Shortcut.registerShortcut("help:showstatusreport", tr("Help: {0}",
-                        tr("Show Status Report")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), true, "help/showstatusreport", false);
-
+        super(false);
+        setName(tr("Show Status Report"));
+        setIcon("clock");
+        setShortcut(Shortcut.registerShortcut("help:showstatusreport", tr("Help: {0}",
+                tr("Show Status Report")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE));
+        setTooltip(tr("Show status report with useful information that can be attached to bugs"));
+        registerInToolbar("help/showstatusreport");
         setHelpId(ht("/Action/ShowStatusReport"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
index ebf0eb28b..70fa84b30 100644
--- a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
@@ -61,8 +61,11 @@
      * Constructs a new {@code SimplifyWayAction}.
      */
     public SimplifyWayAction() {
-        super(tr("Simplify Way"), "simplify", tr("Delete unnecessary nodes from a way."),
-                Shortcut.registerShortcut("tools:simplify", tr("Tool: {0}", tr("Simplify Way")), KeyEvent.VK_Y, Shortcut.SHIFT), true);
+        setName(tr("Simplify Way"));
+        setIcon("simplify");
+        setShortcut(Shortcut.registerShortcut("tools:simplify", tr("Tool: {0}", tr("Simplify Way")), KeyEvent.VK_Y, Shortcut.SHIFT));
+        setTooltip(tr("Delete unnecessary nodes from a way."));
+        registerInToolbar("simplify");
         setHelpId(ht("/Action/SimplifyWay"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SplitWayAction.java b/src/org/openstreetmap/josm/actions/SplitWayAction.java
index ee698e56e..b313cfb47 100644
--- a/src/org/openstreetmap/josm/actions/SplitWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SplitWayAction.java
@@ -54,8 +54,11 @@
      * Create a new SplitWayAction.
      */
     public SplitWayAction() {
-        super(tr("Split Way"), "splitway", tr("Split a way at the selected node."),
-                Shortcut.registerShortcut("tools:splitway", tr("Tool: {0}", tr("Split Way")), KeyEvent.VK_P, Shortcut.DIRECT), true);
+        setName(tr("Split Way"));
+        setIcon("splitway");
+        setShortcut(Shortcut.registerShortcut("tools:splitway", tr("Tool: {0}", tr("Split Way")), KeyEvent.VK_P, Shortcut.DIRECT));
+        setTooltip(tr("Split a way at the selected node."));
+        registerInToolbar("splitway");
         setHelpId(ht("/Action/SplitWay"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java b/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java
index 0f7ea1d7c..a4bc51a8c 100644
--- a/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java
+++ b/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java
@@ -6,7 +6,6 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSearchDialog;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -21,10 +20,12 @@
      * Constructs a new {@code TaggingPresetSearchAction}.
      */
     public TaggingPresetSearchAction() {
-        super(tr("Search preset..."), "dialogs/search", tr("Show preset search dialog"),
-                Shortcut.registerShortcut("preset:search", tr("Search presets"), KeyEvent.VK_F3, Shortcut.DIRECT), false);
-        setToolbarId("presets/search");
-        MainApplication.getToolbar().register(this);
+        setName(tr("Search preset..."));
+        setIcon("dialogs/search");
+        setShortcut(Shortcut.registerShortcut("preset:search", tr("Search presets"), KeyEvent.VK_F3, Shortcut.DIRECT));
+        setTooltip(tr("Show preset search dialog"));
+        setToolbarId("dialogs/search");
+        registerInToolbar("presets/search");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/ToggleAction.java b/src/org/openstreetmap/josm/actions/ToggleAction.java
index 9c64775dd..d5065e7ab 100644
--- a/src/org/openstreetmap/josm/actions/ToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/ToggleAction.java
@@ -24,6 +24,17 @@
 
     private final transient Set<ButtonModel> buttonModels = new HashSet<>();
 
+    /**
+     * Constructs a {@code ToggleAction}.
+     *
+     * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     */
+    public ToggleAction(boolean installAdapters) {
+        super(installAdapters);
+        // It is required to set the SELECTED_KEY to a non-null value in order to let Swing components update it
+        setSelected(false);
+    }
+
     /**
      * Constructs a {@code ToggleAction}.
      *
@@ -38,7 +49,9 @@
      * @param registerInToolbar register this action for the toolbar preferences?
      * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
      * @param installAdapters false, if you don't want to install layer changed and selection changed adapters
+     * @deprecated use {@link JosmAction#JosmAction(boolean)} and setters
      */
+    @Deprecated
     public ToggleAction(String name, ImageProvider icon, String tooltip, Shortcut shortcut, boolean registerInToolbar,
             String toolbarId, boolean installAdapters) {
         super(name, icon, tooltip, shortcut, registerInToolbar, toolbarId, installAdapters);
@@ -58,7 +71,9 @@ public ToggleAction(String name, ImageProvider icon, String tooltip, Shortcut sh
      *            won't be assigned a shortcut unless the user configures one. If you pass null here,
      *            the user CANNOT configure a shortcut for your action.
      * @param registerInToolbar register this action for the toolbar preferences?
+     * @deprecated use setters
      */
+    @Deprecated
     public ToggleAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
         super(name, iconName, tooltip, shortcut, registerInToolbar);
         // It is required to set the SELECTED_KEY to a non-null value in order to let Swing components update it
diff --git a/src/org/openstreetmap/josm/actions/UnGlueAction.java b/src/org/openstreetmap/josm/actions/UnGlueAction.java
index 2aef02a45..6ef6bf06a 100644
--- a/src/org/openstreetmap/josm/actions/UnGlueAction.java
+++ b/src/org/openstreetmap/josm/actions/UnGlueAction.java
@@ -59,8 +59,11 @@
      * Create a new UnGlueAction.
      */
     public UnGlueAction() {
-        super(tr("UnGlue Ways"), "unglueways", tr("Duplicate nodes that are used by multiple ways."),
-                Shortcut.registerShortcut("tools:unglue", tr("Tool: {0}", tr("UnGlue Ways")), KeyEvent.VK_G, Shortcut.DIRECT), true);
+        setName(tr("UnGlue Ways"));
+        setIcon("unglueways");
+        setShortcut(Shortcut.registerShortcut("tools:unglue", tr("Tool: {0}", tr("UnGlue Ways")), KeyEvent.VK_G, Shortcut.DIRECT));
+        setTooltip(tr("Duplicate nodes that are used by multiple ways."));
+        registerInToolbar("unglueways");
         setHelpId(ht("/Action/UnGlue"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java b/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
index 073b09e1f..4a284b53b 100644
--- a/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
+++ b/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
@@ -35,10 +35,12 @@
      * Constructs a new {@code UnJoinNodeWayAction}.
      */
     public UnJoinNodeWayAction() {
-        super(tr("Disconnect Node from Way"), "unjoinnodeway",
-                tr("Disconnect nodes from a way they currently belong to"),
-                Shortcut.registerShortcut("tools:unjoinnodeway",
-                    tr("Tool: {0}", tr("Disconnect Node from Way")), KeyEvent.VK_J, Shortcut.ALT), true);
+        setName(tr("Disconnect Node from Way"));
+        setIcon("unjoinnodeway");
+        setShortcut(Shortcut.registerShortcut("tools:unjoinnodeway", tr("Tool: {0}", tr("Disconnect Node from Way")),
+                KeyEvent.VK_J, Shortcut.ALT));
+        setTooltip(tr("Disconnect nodes from a way they currently belong to"));
+        registerInToolbar("unjoinnodeway");
         setHelpId(ht("/Action/UnJoinNodeWay"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UndoAction.java b/src/org/openstreetmap/josm/actions/UndoAction.java
index 751d16e28..6ce1c3169 100644
--- a/src/org/openstreetmap/josm/actions/UndoAction.java
+++ b/src/org/openstreetmap/josm/actions/UndoAction.java
@@ -24,8 +24,11 @@
      * Construct the action with "Undo" as label.
      */
     public UndoAction() {
-        super(tr("Undo"), "undo", tr("Undo the last action."),
-                Shortcut.registerShortcut("system:undo", tr("Edit: {0}", tr("Undo")), KeyEvent.VK_Z, Shortcut.CTRL), true);
+        setName(tr("Undo"));
+        setIcon("undo");
+        setShortcut(Shortcut.registerShortcut("system:undo", tr("Edit: {0}", tr("Undo")), KeyEvent.VK_Z, Shortcut.CTRL));
+        setTooltip(tr("Undo the last action."));
+        registerInToolbar("undo");
         setEnabled(false);
         setHelpId(ht("/Action/Undo"));
     }
diff --git a/src/org/openstreetmap/josm/actions/UnselectAllAction.java b/src/org/openstreetmap/josm/actions/UnselectAllAction.java
index 8f8d37357..06015f9d3 100644
--- a/src/org/openstreetmap/josm/actions/UnselectAllAction.java
+++ b/src/org/openstreetmap/josm/actions/UnselectAllAction.java
@@ -18,10 +18,11 @@
      * Constructs a new {@code UnselectAllAction}.
      */
     public UnselectAllAction() {
-        super(tr("Unselect All"), "unselectall", tr("Unselect all objects."),
-            Shortcut.registerShortcut("edit:unselectall", tr("Edit: {0}",
-            tr("Unselect All")), KeyEvent.VK_ESCAPE, Shortcut.DIRECT), true);
-
+        setName(tr("Unselect All"));
+        setIcon("unselectall");
+        setShortcut(Shortcut.registerShortcut("edit:unselectall", tr("Edit: {0}", tr("Unselect All")), KeyEvent.VK_ESCAPE, Shortcut.DIRECT));
+        setTooltip(tr("Unselect all objects."));
+        registerInToolbar("unselectall");
         setHelpId(ht("/Action/UnselectAll"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UpdateDataAction.java b/src/org/openstreetmap/josm/actions/UpdateDataAction.java
index d4a37f99a..f77c0d7ad 100644
--- a/src/org/openstreetmap/josm/actions/UpdateDataAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateDataAction.java
@@ -31,13 +31,11 @@
      * Constructs a new {@code UpdateDataAction}.
      */
     public UpdateDataAction() {
-        super(tr("Update data"),
-                "updatedata",
-                tr("Updates the objects in the active data layer from the server."),
-                Shortcut.registerShortcut("file:updatedata",
-                        tr("File: {0}", tr("Update data")),
-                        KeyEvent.VK_U, Shortcut.CTRL),
-                true);
+        setName(tr("Update data"));
+        setIcon("updatedata");
+        setShortcut(Shortcut.registerShortcut("file:updatedata", tr("File: {0}", tr("Update data")), KeyEvent.VK_U, Shortcut.CTRL));
+        setTooltip(tr("Updates the objects in the active data layer from the server."));
+        registerInToolbar("updatedata");
         setHelpId(ht("/Action/UpdateData"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java b/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java
index 59b257612..b8640670c 100644
--- a/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java
@@ -25,12 +25,13 @@
      * Constructs a new {@code UpdateModifiedAction}.
      */
     public UpdateModifiedAction() {
-        super(tr("Update modified"), "updatedata",
-                tr("Updates the currently modified objects from the server (re-downloads data)"),
-                Shortcut.registerShortcut("file:updatemodified",
-                        tr("File: {0}", tr("Update modified")), KeyEvent.VK_M,
-                        Shortcut.ALT_CTRL),
-                        true, "updatemodified");
+        super(false);
+        setName(tr("Update modified"));
+        setIcon("updatedata");
+        setShortcut(Shortcut.registerShortcut("file:updatemodified",
+                tr("File: {0}", tr("Update modified")), KeyEvent.VK_M, Shortcut.ALT_CTRL));
+        setTooltip(tr("Updates the currently modified objects from the server (re-downloads data)"));
+        registerInToolbar("updatemodified");
         setHelpId(ht("/Action/UpdateModified"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java b/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
index a692dcf2f..11694e982 100644
--- a/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
@@ -85,31 +85,17 @@ public static void updatePrimitive(PrimitiveId id) {
      * Constructs a new {@code UpdateSelectionAction}.
      */
     public UpdateSelectionAction() {
-        super(tr("Update selection"), "updatedata",
-                tr("Updates the currently selected objects from the server (re-downloads data)"),
-                Shortcut.registerShortcut("file:updateselection",
-                        tr("File: {0}", tr("Update selection")), KeyEvent.VK_U,
-                        Shortcut.ALT_CTRL),
-                true, "updateselection", true);
+        setName(tr("Update selection"));
+        setIcon("updatedata");
+        setShortcut(Shortcut.registerShortcut("file:updateselection",
+                tr("File: {0}", tr("Update selection")), KeyEvent.VK_U, Shortcut.ALT_CTRL));
+        setTooltip(tr("Updates the currently selected objects from the server (re-downloads data)"));
+        registerInToolbar("updateselection");
         setHelpId(ht("/Action/UpdateSelection"));
     }
 
-    /**
-     * Constructs a new {@code UpdateSelectionAction}.
-     *
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
-     *           that html is not supported for menu actions on some platforms.
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
-     *            do want a shortcut, remember you can always register it with group=none, so you
-     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
-     *            the user CANNOT configure a shortcut for your action.
-     * @param register register this action for the toolbar preferences?
-     * @param toolbarId identifier for the toolbar preferences. The iconName is used, if this parameter is null
-     */
-    public UpdateSelectionAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean register, String toolbarId) {
-        super(name, iconName, tooltip, shortcut, register, toolbarId, true);
+    protected UpdateSelectionAction(boolean installAdapters) {
+        super(installAdapters);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/UploadAction.java b/src/org/openstreetmap/josm/actions/UploadAction.java
index 406d40572..beae81a7c 100644
--- a/src/org/openstreetmap/josm/actions/UploadAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadAction.java
@@ -140,8 +140,11 @@ public static void unregisterUploadHook(UploadHook hook) {
      * Constructs a new {@code UploadAction}.
      */
     public UploadAction() {
-        super(tr("Upload data..."), "upload", tr("Upload all changes in the active data layer to the OSM server"),
-                Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload data")), KeyEvent.VK_UP, Shortcut.CTRL_SHIFT), true);
+        setName(tr("Upload data..."));
+        setIcon("upload");
+        setShortcut(Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload data")), KeyEvent.VK_UP, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Upload all changes in the active data layer to the OSM server"));
+        registerInToolbar("upload");
         setHelpId(ht("/Action/Upload"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UploadSelectionAction.java b/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
index f93942a6c..eab0594c6 100644
--- a/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
@@ -44,14 +44,12 @@
      * Constructs a new {@code UploadSelectionAction}.
      */
     public UploadSelectionAction() {
-        super(
-                tr("Upload selection..."),
-                "uploadselection",
-                tr("Upload all changes in the current selection to the OSM server."),
-                // CHECKSTYLE.OFF: LineLength
-                Shortcut.registerShortcut("file:uploadSelection", tr("File: {0}", tr("Upload selection")), KeyEvent.VK_U, Shortcut.ALT_CTRL_SHIFT),
-                // CHECKSTYLE.ON: LineLength
-                true);
+        setName(tr("Upload selection..."));
+        setIcon("uploadselection");
+        setShortcut(Shortcut.registerShortcut("file:uploadSelection", tr("File: {0}", tr("Upload selection")),
+                KeyEvent.VK_U, Shortcut.ALT_CTRL_SHIFT));
+        setTooltip(tr("Upload all changes in the current selection to the OSM server."));
+        registerInToolbar("uploadselection");
         setHelpId(ht("/Action/UploadSelection"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/ValidateAction.java b/src/org/openstreetmap/josm/actions/ValidateAction.java
index c2e1f4337..833fc2fc1 100644
--- a/src/org/openstreetmap/josm/actions/ValidateAction.java
+++ b/src/org/openstreetmap/josm/actions/ValidateAction.java
@@ -43,9 +43,11 @@
      * Constructor
      */
     public ValidateAction() {
-        super(tr("Validation"), "dialogs/validator", tr("Performs the data validation"),
-                Shortcut.registerShortcut("tools:validate", tr("Tool: {0}", tr("Validation")),
-                        KeyEvent.VK_V, Shortcut.SHIFT), true);
+        setName(tr("Validation"));
+        setIcon("dialogs/validator");
+        setShortcut(Shortcut.registerShortcut("tools:validate", tr("Tool: {0}", tr("Validation")), KeyEvent.VK_V, Shortcut.SHIFT));
+        setTooltip(tr("Performs the data validation"));
+        registerInToolbar("dialogs/validator");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java b/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
index 5d42d6dc1..22fe7deab 100644
--- a/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
@@ -28,13 +28,13 @@
      * Constructs a new {@code ViewportFollowToggleAction}.
      */
     public ViewportFollowToggleAction() {
-        super(tr("Viewport Following"),
-              "viewport-follow",
-              tr("Enable/disable automatic moving of the map view to last placed node"),
-              Shortcut.registerShortcut("menu:view:viewportfollow", tr("Toggle Viewport Following"),
-              KeyEvent.VK_F, Shortcut.CTRL_SHIFT),
-              true /* register shortcut */
-        );
+        super(true);
+        setName(tr("Viewport Following"));
+        setIcon("viewport-follow");
+        setShortcut(Shortcut.registerShortcut("menu:view:viewportfollow", tr("Toggle Viewport Following"),
+                KeyEvent.VK_F, Shortcut.CTRL_SHIFT));
+        setTooltip(tr("Enable/disable automatic moving of the map view to last placed node"));
+        registerInToolbar("viewport-follow");
         setHelpId(ht("/Action/ViewportFollowing"));
         setSelected(DrawAction.VIEWPORT_FOLLOWING.get());
         notifySelectedState();
diff --git a/src/org/openstreetmap/josm/actions/WireframeToggleAction.java b/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
index a4a17917e..5b3ab932f 100644
--- a/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
@@ -9,7 +9,6 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.MapRendererFactory;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
 import org.openstreetmap.josm.data.osm.visitor.paint.WireframeMapRenderer;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -23,14 +22,11 @@
      * Constructs a new {@code WireframeToggleAction}.
      */
     public WireframeToggleAction() {
-        super(tr("Wireframe View"),
-              null, /* no icon */
-              tr("Enable/disable rendering the map as wireframe only"),
-              Shortcut.registerShortcut("menu:view:wireframe", tr("Toggle Wireframe view"), KeyEvent.VK_W, Shortcut.CTRL),
-              false /* register toolbar */
-        );
-        setToolbarId("wireframe");
-        MainApplication.getToolbar().register(this);
+        super(true);
+        setName(tr("Wireframe View"));
+        setShortcut(Shortcut.registerShortcut("menu:view:wireframe", tr("Toggle Wireframe view"), KeyEvent.VK_W, Shortcut.CTRL));
+        setTooltip(tr("Enable/disable rendering the map as wireframe only"));
+        registerInToolbar("wireframe");
         setSelected(MapRendererFactory.getInstance().isWireframeMapRendererActive());
         notifySelectedState();
     }
diff --git a/src/org/openstreetmap/josm/actions/ZoomInAction.java b/src/org/openstreetmap/josm/actions/ZoomInAction.java
index 18a1a70e3..f733683ab 100644
--- a/src/org/openstreetmap/josm/actions/ZoomInAction.java
+++ b/src/org/openstreetmap/josm/actions/ZoomInAction.java
@@ -20,14 +20,12 @@
      * Constructs a new {@code ZoomInAction}.
      */
     public ZoomInAction() {
-        super(
-                tr("Zoom In"),
-                "dialogs/zoomin",
-                tr("Zoom In"),
-                // Although it might be possible on few custom keyboards, the vast majority of layouts do not have a direct '+' key, see below
-                Shortcut.registerShortcut("view:zoomin", tr("View: {0}", tr("Zoom In")), KeyEvent.VK_PLUS, Shortcut.DIRECT),
-                true
-        );
+        setName(tr("Zoom In"));
+        setIcon("dialogs/zoomin");
+        // Although it might be possible on few custom keyboards, the vast majority of layouts do not have a direct '+' key, see below
+        setShortcut(Shortcut.registerShortcut("view:zoomin", tr("View: {0}", tr("Zoom In")), KeyEvent.VK_PLUS, Shortcut.DIRECT));
+        setTooltip(tr("Zoom In"));
+        registerInToolbar("dialogs/zoomin");
         setHelpId(ht("/Action/ZoomIn"));
         // On standard QWERTY, AZERTY and other common layouts the '+' key is obtained with Shift+EQUALS
         MainApplication.registerActionShortcut(this,
diff --git a/src/org/openstreetmap/josm/actions/ZoomOutAction.java b/src/org/openstreetmap/josm/actions/ZoomOutAction.java
index d4c4ff1b9..9c9e5c1bd 100644
--- a/src/org/openstreetmap/josm/actions/ZoomOutAction.java
+++ b/src/org/openstreetmap/josm/actions/ZoomOutAction.java
@@ -20,8 +20,11 @@
      * Constructs a new {@code ZoomOutAction}.
      */
     public ZoomOutAction() {
-        super(tr("Zoom Out"), "dialogs/zoomout", tr("Zoom Out"),
-                Shortcut.registerShortcut("view:zoomout", tr("View: {0}", tr("Zoom Out")), KeyEvent.VK_MINUS, Shortcut.DIRECT), true);
+        setName(tr("Zoom Out"));
+        setIcon("dialogs/zoomout");
+        setShortcut(Shortcut.registerShortcut("view:zoomout", tr("View: {0}", tr("Zoom Out")), KeyEvent.VK_MINUS, Shortcut.DIRECT));
+        setTooltip(tr("Zoom Out"));
+        registerInToolbar("dialogs/zoomout");
         setHelpId(ht("/Action/ZoomOut"));
         // make numpad - behave like -
         MainApplication.registerActionShortcut(this,
diff --git a/src/org/openstreetmap/josm/actions/audio/AbstractAudioAction.java b/src/org/openstreetmap/josm/actions/audio/AbstractAudioAction.java
index 315916618..6b67fb376 100644
--- a/src/org/openstreetmap/josm/actions/audio/AbstractAudioAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AbstractAudioAction.java
@@ -5,7 +5,6 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.markerlayer.AudioMarker;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
-import org.openstreetmap.josm.tools.Shortcut;
 
 /**
  * Base class for every action related to audio content.
@@ -15,14 +14,8 @@
 
     /**
      * Constructs a new {@code BaseAudioAction}.
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip a longer description of the action that will be displayed in the tooltip
-     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut
-     * @param registerInToolbar register this action for the toolbar preferences?
      */
-    public AbstractAudioAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean registerInToolbar) {
-        super(name, iconName, tooltip, shortcut, registerInToolbar);
+    public AbstractAudioAction() {
         updateEnabledState();
     }
 
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java b/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java
index 6d609773a..ad3e6ac54 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java
@@ -25,8 +25,11 @@
      * Constructs a new {@code AudioBackAction}.
      */
     public AudioBackAction() {
-        super(trc("audio", "Back"), "audio-back", trc("audio", "Jump back."),
-        Shortcut.registerShortcut("audio:back", tr("Audio: {0}", trc("audio", "Back")), KeyEvent.VK_F6, Shortcut.DIRECT), true);
+        setName(trc("audio", "Back"));
+        setIcon("audio-back");
+        setShortcut(Shortcut.registerShortcut("audio:back", tr("Audio: {0}", trc("audio", "Back")), KeyEvent.VK_F6, Shortcut.DIRECT));
+        setTooltip(trc("audio", "Jump back."));
+        registerInToolbar("audio-back");
         setHelpId(ht("/Action/AudioBack"));
     }
 
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java b/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java
index ab83c8000..f75ebe222 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java
@@ -7,7 +7,6 @@
 import org.openstreetmap.josm.io.audio.AudioPlayer;
 import org.openstreetmap.josm.io.audio.AudioUtil;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.tools.Shortcut;
 
 /**
  * Abstract superclass of {@link AudioFasterAction} and {@link AudioSlowerAction}.
@@ -20,14 +19,9 @@
     /**
      * Constructs a new {@code AudioFastSlowAction}.
      *
-     * @param name the action's text as displayed on the menu (if it is added to a menu)
-     * @param iconName the filename of the icon to use
-     * @param tooltip  a longer description of the action that will be displayed in the tooltip.
-     * @param shortcut a ready-created shortcut object.
      * @param fast {@code true} to increase speed (faster audio), {@code false} to decrease it (slower audio).
      */
-    public AudioFastSlowAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean fast) {
-        super(name, iconName, tooltip, shortcut, true);
+    public AudioFastSlowAction(boolean fast) {
         multiplier = Config.getPref().getDouble("audio.fastfwdmultiplier", 1.3);
         if (!fast)
             multiplier = 1.0 / multiplier;
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioFasterAction.java b/src/org/openstreetmap/josm/actions/audio/AudioFasterAction.java
index 0eca15e99..125a556aa 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioFasterAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioFasterAction.java
@@ -20,8 +20,11 @@
      * Constructs a new {@code AudioFasterAction}.
      */
     public AudioFasterAction() {
-        super(trc("audio", "Faster"), "audio-faster", trc("audio", "Faster Forward"),
-        Shortcut.registerShortcut("audio:faster", tr("Audio: {0}", trc("audio", "Faster")), KeyEvent.VK_F9, Shortcut.DIRECT), true);
+        super(true);
+        setName(trc("audio", "Faster"));
+        setIcon("audio-faster");
+        setShortcut(Shortcut.registerShortcut("audio:faster", tr("Audio: {0}", trc("audio", "Faster")), KeyEvent.VK_F9, Shortcut.DIRECT));
+        setTooltip(trc("audio", "Faster Forward"));
         setHelpId(ht("/Action/AudioFaster"));
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java b/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java
index 0eed041a5..520f979fc 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java
@@ -24,8 +24,11 @@
      * Constructs a new {@code AudioFwdAction}.
      */
     public AudioFwdAction() {
-        super(trc("audio", "Forward"), "audio-fwd", trc("audio", "Jump forward"),
-        Shortcut.registerShortcut("audio:forward", tr("Audio: {0}", trc("audio", "Forward")), KeyEvent.VK_F7, Shortcut.DIRECT), true);
+        setName(trc("audio", "Forward"));
+        setIcon("audio-fwd");
+        setShortcut(Shortcut.registerShortcut("audio:forward", tr("Audio: {0}", trc("audio", "Forward")), KeyEvent.VK_F7, Shortcut.DIRECT));
+        setTooltip(trc("audio", "Jump forward"));
+        registerInToolbar("audio-fwd");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioNextAction.java b/src/org/openstreetmap/josm/actions/audio/AudioNextAction.java
index 5fbc41162..2661b83b8 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioNextAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioNextAction.java
@@ -21,8 +21,11 @@
      * Constructs a new {@code AudioNextAction}.
      */
     public AudioNextAction() {
-        super(trc("audio", "Next Marker"), "audio-next", trc("audio", "Play next marker."),
-        Shortcut.registerShortcut("audio:next", tr("Audio: {0}", trc("audio", "Next Marker")), KeyEvent.VK_F8, Shortcut.DIRECT), true);
+        setName(trc("audio", "Next Marker"));
+        setIcon("audio-next");
+        setShortcut(Shortcut.registerShortcut("audio:next", tr("Audio: {0}", trc("audio", "Next Marker")), KeyEvent.VK_F8, Shortcut.DIRECT));
+        setTooltip(trc("audio", "Play next marker."));
+        registerInToolbar("audio-next");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java b/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
index b9ed619cb..1774c2b1c 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
@@ -28,8 +28,12 @@
      * Constructs a new {@code AudioPlayPauseAction}.
      */
     public AudioPlayPauseAction() {
-        super(trc("audio", "Play/Pause"), "audio-playpause", tr("Play/pause audio."),
-        Shortcut.registerShortcut("audio:pause", tr("Audio: {0}", trc("audio", "Play/Pause")), KeyEvent.VK_PERIOD, Shortcut.DIRECT), true);
+        setName(trc("audio", "Play/Pause"));
+        setIcon("audio-playpause");
+        setShortcut(Shortcut.registerShortcut("audio:pause", tr("Audio: {0}", trc("audio", "Play/Pause")),
+                KeyEvent.VK_PERIOD, Shortcut.DIRECT));
+        setTooltip(tr("Play/pause audio."));
+        registerInToolbar("audio-playpause");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioPrevAction.java b/src/org/openstreetmap/josm/actions/audio/AudioPrevAction.java
index 9ac8040ec..c4a7a15a8 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioPrevAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioPrevAction.java
@@ -21,8 +21,12 @@
      * Constructs a new {@code AudioPrevAction}.
      */
     public AudioPrevAction() {
-        super(trc("audio", "Previous Marker"), "audio-prev", trc("audio", "Play previous marker."),
-        Shortcut.registerShortcut("audio:prev", tr("Audio: {0}", trc("audio", "Previous Marker")), KeyEvent.VK_F5, Shortcut.DIRECT), true);
+        setName(trc("audio", "Previous Marker"));
+        setIcon("audio-prev");
+        setShortcut(Shortcut.registerShortcut("audio:prev", tr("Audio: {0}", trc("audio", "Previous Marker")),
+                KeyEvent.VK_F5, Shortcut.DIRECT));
+        setTooltip(trc("audio", "Play previous marker."));
+        registerInToolbar("audio-prev");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java b/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java
index 300a944af..738416785 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java
@@ -20,8 +20,11 @@
      * Constructs a new {@code AudioSlowerAction}.
      */
     public AudioSlowerAction() {
-        super(trc("audio", "Slower"), "audio-slower", trc("audio", "Slower Forward"),
-        Shortcut.registerShortcut("audio:slower", tr("Audio: {0}", trc("audio", "Slower")), KeyEvent.VK_F4, Shortcut.DIRECT), false);
+        super(false);
+        setName(trc("audio", "Slower"));
+        setIcon("audio-slower");
+        setShortcut(Shortcut.registerShortcut("audio:slower", tr("Audio: {0}", trc("audio", "Slower")), KeyEvent.VK_F4, Shortcut.DIRECT));
+        setTooltip(trc("audio", "Slower Forward"));
         setHelpId(ht("/Action/AudioSlower"));
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
index b436c5f3b..974530a59 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
@@ -1396,8 +1396,10 @@ public void actionPerformed(ActionEvent e) {
          * Constructs a new {@code SnapChangeAction}.
          */
         SnapChangeAction() {
-            super(tr("Angle snapping"), /* ICON() */ "anglesnap",
-                    tr("Switch angle snapping mode while drawing"), null, false);
+            setName(tr("Angle snapping"));
+            setIcon(/* ICON() */ "anglesnap");
+            setTooltip(tr("Switch angle snapping mode while drawing"));
+            setToolbarId("anglesnap");
             setHelpId(ht("/Action/Draw/AngleSnap"));
         }
 
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
index 030937e86..261dd10f9 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
@@ -195,8 +195,10 @@ public String toString() {
 
     private class DualAlignChangeAction extends JosmAction {
         DualAlignChangeAction() {
-            super(tr("Dual alignment"), /* ICON() */ "mapmode/extrude/dualalign",
-                    tr("Switch dual alignment mode while extruding"), null, false);
+            setName(tr("Dual alignment"));
+            setIcon(/* ICON() */ "mapmode/extrude/dualalign");
+            setTooltip(tr("Switch dual alignment mode while extruding"));
+            setToolbarId("mapmode/extrude/dualalign");
             setHelpId(ht("/Action/Extrude#DualAlign"));
         }
 
diff --git a/src/org/openstreetmap/josm/actions/mapmode/MapMode.java b/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
index ad825161e..23fd31d18 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
@@ -44,7 +44,11 @@
      * @since 11713
      */
     public MapMode(String name, String iconName, String tooltip, Shortcut shortcut, Cursor cursor) {
-        super(name, "mapmode/"+iconName, tooltip, shortcut, false);
+        setName(name);
+        setIcon("mapmode/" + iconName);
+        setShortcut(shortcut);
+        setTooltip(tooltip);
+        setToolbarId("mapmode/" + iconName);
         this.cursor = cursor;
         putValue("active", Boolean.FALSE);
     }
@@ -58,9 +62,9 @@ public MapMode(String name, String iconName, String tooltip, Shortcut shortcut,
      * @since 11713
      */
     public MapMode(String name, String iconName, String tooltip, Cursor cursor) {
-        putValue(NAME, name);
+        setName(name);
+        setTooltip(tooltip);
         new ImageProvider("mapmode", iconName).getResource().attachImageIcon(this);
-        putValue(SHORT_DESCRIPTION, tooltip);
         this.cursor = cursor;
     }
 
diff --git a/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java b/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java
index 0831df871..8e9eded2c 100644
--- a/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java
@@ -77,8 +77,10 @@ public ExportRelationToGpxAction() {
      * @param mode which mode to use, see {@code ExportRelationToGpxAction.Mode}
      */
     public ExportRelationToGpxAction(Set<Mode> mode) {
-        super(name(mode), mode.contains(TO_FILE) ? "exportgpx" : "dialogs/layerlist", tooltip(mode),
-                null, false, null, false);
+        super(false);
+        setName(name(mode));
+        setIcon(mode.contains(TO_FILE) ? "exportgpx" : "dialogs/layerlist");
+        setTooltip(tooltip(mode));
         setHelpId(ht("/Action/ExportRelationToGpx"));
         this.mode = mode;
     }
diff --git a/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java b/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
index f9cefcf21..e067bf68b 100644
--- a/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
@@ -45,7 +45,7 @@
      * @param editButton edit button
      */
     public RecentRelationsAction(SideButton editButton) {
-        super(RecentRelationsAction.class.getName(), null, null, null, false, true);
+        setName(RecentRelationsAction.class.getName());
         this.editButton = editButton;
         arrow = editButton.createArrow(this);
         arrow.setToolTipText(tr("List of recent relations"));
diff --git a/src/org/openstreetmap/josm/actions/search/SearchAction.java b/src/org/openstreetmap/josm/actions/search/SearchAction.java
index f634ded70..d72b8e1c4 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchAction.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchAction.java
@@ -142,8 +142,11 @@ public static void saveToHistory(SearchSetting s) {
      * Constructs a new {@code SearchAction}.
      */
     public SearchAction() {
-        super(tr("Search..."), "dialogs/search", tr("Search for objects"),
-                Shortcut.registerShortcut("system:find", tr("Search..."), KeyEvent.VK_F, Shortcut.CTRL), true);
+        setName(tr("Search..."));
+        setIcon("dialogs/search");
+        setShortcut(Shortcut.registerShortcut("system:find", tr("Search..."), KeyEvent.VK_F, Shortcut.CTRL));
+        setTooltip(tr("Search for objects"));
+        registerInToolbar("dialogs/search");
         setHelpId(ht("/Action/Search"));
     }
 
diff --git a/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java b/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
index cc29b0aab..e67169453 100644
--- a/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
+++ b/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
@@ -203,7 +203,11 @@ private static JButton createHelpButton(String helpTopic) {
         private final String helpTopic;
 
         HelpAction(String helpTopic) {
-            super(tr("Help"), "help", tr("Show help information"), null, false, false);
+            super(false);
+            setName(tr("Help"));
+            setIcon("help");
+            setTooltip(tr("Show help information"));
+            setToolbarId("help");
             this.helpTopic = helpTopic;
         }
 
diff --git a/src/org/openstreetmap/josm/gui/ImageryMenu.java b/src/org/openstreetmap/josm/gui/ImageryMenu.java
index a192edafe..e1bc0ad57 100644
--- a/src/org/openstreetmap/josm/gui/ImageryMenu.java
+++ b/src/org/openstreetmap/josm/gui/ImageryMenu.java
@@ -54,9 +54,12 @@
     static final class AdjustImageryOffsetAction extends JosmAction {
 
         AdjustImageryOffsetAction() {
-            super(tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false);
-            setToolbarId("imagery-offset");
-            MainApplication.getToolbar().register(this);
+            super(false);
+            setName(tr("Imagery offset"));
+            setIcon("mapmode/adjustimg");
+            setTooltip(tr("Adjust imagery offset"));
+            setToolbarId("mapmode/adjustimg");
+            registerInToolbar("imagery-offset");
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
index 5c78e16fb..8ec84d5af 100644
--- a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
+++ b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
@@ -27,23 +27,33 @@
 
     private final AutoFilter filter;
 
+    private static class Action extends JosmAction {
+        private final AutoFilter filter;
+
+        Action(AutoFilter filter) {
+            this.filter = filter;
+            setName(filter.getLabel());
+            setTooltip(filter.getDescription());
+        }
+
+        @Override
+        public synchronized void actionPerformed(ActionEvent e) {
+            AutoFilterManager afm = AutoFilterManager.getInstance();
+            if (filter.equals(afm.getCurrentAutoFilter())) {
+                afm.setCurrentAutoFilter(null);
+                MainApplication.getMap().filterDialog.getFilterModel().executeFilters(true);
+            } else {
+                afm.setCurrentAutoFilter(filter);
+            }
+        }
+    }
+
     /**
      * Constructs a new {@code AutoFilterButton}.
      * @param filter auto filter associated to this button
      */
     public AutoFilterButton(final AutoFilter filter) {
-        super(new JosmAction(filter.getLabel(), null, filter.getDescription(), null, false) {
-            @Override
-            public synchronized void actionPerformed(ActionEvent e) {
-                AutoFilterManager afm = AutoFilterManager.getInstance();
-                if (filter.equals(afm.getCurrentAutoFilter())) {
-                    afm.setCurrentAutoFilter(null);
-                    MainApplication.getMap().filterDialog.getFilterModel().executeFilters(true);
-                } else {
-                    afm.setCurrentAutoFilter(filter);
-                }
-            }
-        });
+        super(new Action(filter));
         this.filter = filter;
         setForeground(Color.WHITE);
         setContentAreaFilled(false);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java
index 02e96d069..6adcca07b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java
@@ -131,9 +131,11 @@ public Component getListCellRendererComponent(JList<? extends JMenuItem> list, J
          * Constructs a new {@code Action}.
          */
         public Action() {
-            super(tr("Search menu items"), "dialogs/search", null,
-                    SHORTCUT,
-                    true, "dialogs/search-items", false);
+            super(false);
+            setName(tr("Search menu items"));
+            setIcon("dialogs/search");
+            setShortcut(SHORTCUT);
+            registerInToolbar("dialogs/search-items");
             setHelpId(ht("Action/SearchMenuItems"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
index e2b8636a2..e3ec03cb7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
@@ -300,7 +300,11 @@ protected void registerInWindowMenu(boolean isExpert) {
     public final class ToggleDialogAction extends JosmAction {
 
         private ToggleDialogAction(String name, String iconName, String tooltip, Shortcut shortcut, String helpId) {
-            super(name, iconName, tooltip, shortcut, false, false);
+            super(false);
+            setName(name);
+            setIcon(iconName);
+            setShortcut(shortcut);
+            setTooltip(tooltip);
             setHelpId(helpId);
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
index 00347787f..bd493e2d7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
@@ -204,9 +204,9 @@ public void valueChanged(ListSelectionEvent e) {
 
         ShowUserInfoAction() {
             super(false);
-            putValue(NAME, tr("Show info"));
-            putValue(SHORT_DESCRIPTION, tr("Launches a browser with information about the user"));
-            new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
+            setName(tr("Show info"));
+            setTooltip(tr("Launches a browser with information about the user"));
+            setIcon("help/internet");
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
index 044698997..63bc88f3d 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
@@ -123,21 +123,7 @@ public ValidatorDialog() {
         addTreeSelectionListener(new SelectionWatch());
         InputMapUtils.unassignCtrlShiftUpDown(tree, JComponent.WHEN_FOCUSED);
 
-        ignoreForNowAction = new JosmAction(tr("Ignore for now"), "dialogs/delete",
-                tr("Ignore and remove from tree."), Shortcut.registerShortcut("tools:validate:ignore-for-now",
-                        tr("Ignore and remove from tree."), KeyEvent.VK_MINUS, Shortcut.SHIFT),
-                false, false) {
-
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                TestError error = getSelectedError();
-                if (error != null) {
-                    error.setIgnored(true);
-                    tree.resetErrors();
-                    invalidateValidatorLayers();
-                }
-            }
-        };
+        ignoreForNowAction = new IgnoreForNowAction();
 
         popupMenuHandler.addAction(MainApplication.getMenu().autoScaleActions.get("problem"));
         popupMenuHandler.addAction(new EditRelationAction());
@@ -730,4 +716,27 @@ public void destroy() {
             ignoreForNowAction.destroy();
         }
     }
+
+    private class IgnoreForNowAction extends JosmAction {
+
+        IgnoreForNowAction() {
+            super(false);
+            setName(tr("Ignore for now"));
+            setIcon("dialogs/delete");
+            setShortcut(Shortcut.registerShortcut("tools:validate:ignore-for-now", tr("Ignore and remove from tree."),
+                    KeyEvent.VK_MINUS, Shortcut.SHIFT));
+            setTooltip(tr("Ignore and remove from tree."));
+            setToolbarId("dialogs/delete");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            TestError error = getSelectedError();
+            if (error != null) {
+                error.setIgnored(true);
+                tree.resetErrors();
+                invalidateValidatorLayers();
+            }
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerDownAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerDownAction.java
index 425e9b208..bc6e1d67e 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerDownAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerDownAction.java
@@ -15,7 +15,6 @@
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MainLayerManager;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -33,11 +32,12 @@
      * Create a CycleLayerDownAction that cycles through layers that are in the model
      */
     public CycleLayerDownAction() {
-        super(tr("Cycle layer down"), "dialogs/previous", tr("Cycle through data layers in a downward direction"),
-                cycleDown, true, "cycle-layer-down", false);
-        new ImageProvider("dialogs", "previous").getResource().attachImageIcon(this, true);
-        putValue(SHORT_DESCRIPTION, tr("Cycle through visible layers."));
-        putValue(NAME, tr("Cycle layers"));
+        super(false);
+        setName(tr("Cycle layers"));
+        setIcon("dialogs/previous");
+        setShortcut(cycleDown);
+        setTooltip(tr("Cycle through visible layers."));
+        registerInToolbar("cycle-layer-down");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerUpAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerUpAction.java
index d9adff6e2..742e7c531 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerUpAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/CycleLayerUpAction.java
@@ -13,7 +13,6 @@
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MainLayerManager;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -31,11 +30,12 @@
      * Create a CycleLayerDownAction that cycles through layers that are in the model
      */
     public CycleLayerUpAction() {
-        super(tr("Cycle layer up"), "dialogs/next", tr("Cycle through data layers in an upward direction"),
-                cycleUp, true, "cycle-layer-up", false);
-        new ImageProvider("dialogs", "next").getResource().attachImageIcon(this, true);
-        putValue(SHORT_DESCRIPTION, tr("Cycle through visible layers."));
-        putValue(NAME, tr("Cycle layers"));
+        super(false);
+        setName(tr("Cycle layers"));
+        setIcon("dialogs/next");
+        setShortcut(cycleUp);
+        setTooltip(tr("Cycle through visible layers."));
+        registerInToolbar("cycle-layer-up");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
index d2883342c..7b8e2fbe4 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
@@ -1079,9 +1079,11 @@ public boolean isCellEditable(int row, int column) {
         private static final String DELETE_FROM_RELATION_PREF = "delete_from_relation";
 
         DeleteAction() {
-            super(tr("Delete"), /* ICON() */ "dialogs/delete", tr("Delete the selected key in all objects"),
-                    Shortcut.registerShortcut("properties:delete", tr("Delete Tags"), KeyEvent.VK_D,
-                            Shortcut.ALT_CTRL_SHIFT), false);
+            setName(tr("Delete"));
+            setIcon(/* ICON() */ "dialogs/delete");
+            setShortcut(Shortcut.registerShortcut("properties:delete", tr("Delete Tags"), KeyEvent.VK_D, Shortcut.ALT_CTRL_SHIFT));
+            setTooltip(tr("Delete the selected key in all objects"));
+            setToolbarId("dialogs/delete");
             updateEnabledState();
         }
 
@@ -1189,9 +1191,11 @@ public void valueChanged(ListSelectionEvent e) {
     class AddAction extends JosmAction {
         AtomicBoolean isPerforming = new AtomicBoolean(false);
         AddAction() {
-            super(tr("Add"), /* ICON() */ "dialogs/add", tr("Add a new key/value pair to all objects"),
-                    Shortcut.registerShortcut("properties:add", tr("Add Tag"), KeyEvent.VK_A,
-                            Shortcut.ALT), false);
+            setName(tr("Add"));
+            setIcon(/* ICON() */ "dialogs/add");
+            setShortcut(Shortcut.registerShortcut("properties:add", tr("Add Tag"), KeyEvent.VK_A, Shortcut.ALT));
+            setTooltip(tr("Add a new key/value pair to all objects"));
+            setToolbarId("dialogs/add");
         }
 
         @Override
@@ -1214,9 +1218,11 @@ public void actionPerformed(ActionEvent e) {
     class EditAction extends JosmAction implements ListSelectionListener {
         AtomicBoolean isPerforming = new AtomicBoolean(false);
         EditAction() {
-            super(tr("Edit"), /* ICON() */ "dialogs/edit", tr("Edit the value of the selected key for all objects"),
-                    Shortcut.registerShortcut("properties:edit", tr("Edit Tags"), KeyEvent.VK_S,
-                            Shortcut.ALT), false);
+            setName(tr("Edit"));
+            setIcon(/* ICON() */ "dialogs/edit");
+            setShortcut(Shortcut.registerShortcut("properties:edit", tr("Edit Tags"), KeyEvent.VK_S, Shortcut.ALT));
+            setTooltip(tr("Edit the value of the selected key for all objects"));
+            setToolbarId("dialogs/edit");
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
index 57a52a381..e0a28e84c 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
@@ -947,8 +947,13 @@ protected void buildRecentTagsPanel() {
                 /* POSSIBLE SHORTCUTS: 1,2,3,4,5,6,7,8,9,0=10 */
                 final Shortcut sc = count > 10 ? null : Shortcut.registerShortcut("properties:recent:" + count,
                         tr("Choose recent tag {0}", count), KeyEvent.VK_0 + (count % 10), Shortcut.CTRL);
-                final JosmAction action = new JosmAction(
-                        tr("Choose recent tag {0}", count), null, tr("Use this tag again"), sc, false) {
+                int finalCount = count;
+                final JosmAction action = new JosmAction(false) {
+                    {
+                        setName(tr("Choose recent tag {0}", finalCount));
+                        setShortcut(sc);
+                        setTooltip(tr("Use this tag again"));
+                    }
                     @Override
                     public void actionPerformed(ActionEvent e) {
                         keys.setSelectedItem(t.getKey(), true);
@@ -961,8 +966,12 @@ public void actionPerformed(ActionEvent e) {
                 /* POSSIBLE SHORTCUTS: 1,2,3,4,5,6,7,8,9,0=10 */
                 final Shortcut scShift = count > 10 ? null : Shortcut.registerShortcut("properties:recent:apply:" + count,
                          tr("Apply recent tag {0}", count), KeyEvent.VK_0 + (count % 10), Shortcut.CTRL_SHIFT);
-                final JosmAction actionShift = new JosmAction(
-                        tr("Apply recent tag {0}", count), null, tr("Use this tag again"), scShift, false) {
+                final JosmAction actionShift = new JosmAction(false) {
+                    {
+                        setName(tr("Apply recent tag {0}", finalCount));
+                        setShortcut(scShift);
+                        setTooltip(tr("Use this tag again"));
+                    }
                     @Override
                     public void actionPerformed(ActionEvent e) {
                         action.actionPerformed(null);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
index b52f923a1..1f6cb61aa 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
@@ -751,11 +751,12 @@ public void setVisible(boolean visible) {
     protected static JMenuItem addToWindowMenu(IRelationEditor re, String layerName) {
         Relation r = re.getRelation();
         String name = r == null ? tr("New relation") : r.getLocalName();
-        JosmAction focusAction = new JosmAction(
-                tr("Relation Editor: {0}", name == null && r != null ? r.getId() : name),
-                "dialogs/relationlist",
-                tr("Focus Relation Editor with relation ''{0}'' in layer ''{1}''", name, layerName),
-                null, false, false) {
+        JosmAction focusAction = new JosmAction(false) {
+            {
+                setName(tr("Relation Editor: {0}", name == null && r != null ? r.getId() : name));
+                setIcon("dialogs/relationlist");
+                setTooltip(tr("Focus Relation Editor with relation ''{0}'' in layer ''{1}''", name, layerName));
+            }
             private static final long serialVersionUID = 1L;
 
             @Override
diff --git a/src/org/openstreetmap/josm/gui/help/HelpBrowser.java b/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
index 8b649ef11..c968c54a0 100644
--- a/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
+++ b/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
@@ -71,7 +71,11 @@
 
     private final transient HelpContentReader reader;
 
-    private static final JosmAction FOCUS_ACTION = new JosmAction(tr("JOSM Help Browser"), "help", "", null, false, false) {
+    private static final JosmAction FOCUS_ACTION = new JosmAction(false) {
+        {
+            setName(tr("JOSM Help Browser"));
+            setIcon("help");
+        }
         @Override
         public void actionPerformed(ActionEvent e) {
             HelpBrowser.getInstance().setVisible(true);
diff --git a/src/org/openstreetmap/josm/gui/history/VersionTable.java b/src/org/openstreetmap/josm/gui/history/VersionTable.java
index fb7263a6f..1e337e5a8 100644
--- a/src/org/openstreetmap/josm/gui/history/VersionTable.java
+++ b/src/org/openstreetmap/josm/gui/history/VersionTable.java
@@ -37,7 +37,6 @@
 import org.openstreetmap.josm.io.XmlWriter;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Destroyable;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OpenBrowser;
 
 /**
@@ -162,9 +161,9 @@ protected int checkTableSelection(JTable table, Point p) {
          */
         ChangesetInfoAction() {
             super(true);
-            putValue(NAME, tr("Changeset info"));
-            putValue(SHORT_DESCRIPTION, tr("Launch browser with information about the changeset"));
-            new ImageProvider("data/changeset").getResource().attachImageIcon(this, true);
+            setName(tr("Changeset info"));
+            setTooltip(tr("Launch browser with information about the changeset"));
+            setIcon("data/changeset");
         }
 
         @Override
@@ -199,9 +198,9 @@ public void prepare(HistoryOsmPrimitive primitive) {
          */
         UserInfoAction() {
             super(true);
-            putValue(NAME, tr("User info"));
-            putValue(SHORT_DESCRIPTION, tr("Launch browser with information about the user"));
-            new ImageProvider("data/user").getResource().attachImageIcon(this, true);
+            setName(tr("User info"));
+            setTooltip(tr("Launch browser with information about the user"));
+            setIcon("data/user");
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
index ad5d0e9ea..a0b9c06c9 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
@@ -201,9 +201,10 @@ public void destroy() {
 
     private class ImageNextAction extends JosmAction {
         ImageNextAction() {
-            super(null, new ImageProvider("dialogs", "next"), tr("Next"), Shortcut.registerShortcut(
-                    "geoimage:next", tr("Geoimage: {0}", tr("Show next Image")), KeyEvent.VK_PAGE_DOWN, Shortcut.DIRECT),
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "next"));
+            setShortcut(Shortcut.registerShortcut(
+                        "geoimage:next", tr("Geoimage: {0}", tr("Show next Image")), KeyEvent.VK_PAGE_DOWN, Shortcut.DIRECT));
+            setTooltip(tr("Next"));
         }
 
         @Override
@@ -216,9 +217,10 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImagePreviousAction extends JosmAction {
         ImagePreviousAction() {
-            super(null, new ImageProvider("dialogs", "previous"), tr("Previous"), Shortcut.registerShortcut(
-                    "geoimage:previous", tr("Geoimage: {0}", tr("Show previous Image")), KeyEvent.VK_PAGE_UP, Shortcut.DIRECT),
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "previous"));
+            setShortcut(Shortcut.registerShortcut(
+                        "geoimage:previous", tr("Geoimage: {0}", tr("Show previous Image")), KeyEvent.VK_PAGE_UP, Shortcut.DIRECT));
+            setTooltip(tr("Previous"));
         }
 
         @Override
@@ -231,9 +233,10 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageFirstAction extends JosmAction {
         ImageFirstAction() {
-            super(null, new ImageProvider("dialogs", "first"), tr("First"), Shortcut.registerShortcut(
-                    "geoimage:first", tr("Geoimage: {0}", tr("Show first Image")), KeyEvent.VK_HOME, Shortcut.DIRECT),
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "first"));
+            setShortcut(Shortcut.registerShortcut(
+                        "geoimage:first", tr("Geoimage: {0}", tr("Show first Image")), KeyEvent.VK_HOME, Shortcut.DIRECT));
+            setTooltip(tr("First"));
         }
 
         @Override
@@ -246,9 +249,10 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageLastAction extends JosmAction {
         ImageLastAction() {
-            super(null, new ImageProvider("dialogs", "last"), tr("Last"), Shortcut.registerShortcut(
-                    "geoimage:last", tr("Geoimage: {0}", tr("Show last Image")), KeyEvent.VK_END, Shortcut.DIRECT),
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "last"));
+            setShortcut(Shortcut.registerShortcut(
+                        "geoimage:last", tr("Geoimage: {0}", tr("Show last Image")), KeyEvent.VK_END, Shortcut.DIRECT));
+            setTooltip(tr("Last"));
         }
 
         @Override
@@ -261,8 +265,8 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageCenterViewAction extends JosmAction {
         ImageCenterViewAction() {
-            super(null, new ImageProvider("dialogs/autoscale", "selection"), tr("Center view"), null,
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs/autoscale", "selection"));
+            setTooltip(tr("Center view"));
         }
 
         @Override
@@ -277,8 +281,8 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageZoomAction extends JosmAction {
         ImageZoomAction() {
-            super(null, new ImageProvider("dialogs", "zoom-best-fit"), tr("Zoom best fit and 1:1"), null,
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "zoom-best-fit"));
+            setTooltip(tr("Zoom best fit and 1:1"));
         }
 
         @Override
@@ -289,9 +293,10 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageRemoveAction extends JosmAction {
         ImageRemoveAction() {
-            super(null, new ImageProvider("dialogs", "delete"), tr("Remove photo from layer"), Shortcut.registerShortcut(
-                    "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")), KeyEvent.VK_DELETE, Shortcut.SHIFT),
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "delete"));
+            setShortcut(Shortcut.registerShortcut("geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")),
+                    KeyEvent.VK_DELETE, Shortcut.SHIFT));
+            setTooltip(tr("Remove photo from layer"));
         }
 
         @Override
@@ -304,10 +309,10 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageRemoveFromDiskAction extends JosmAction {
         ImageRemoveFromDiskAction() {
-            super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete image file from disk"),
-                    Shortcut.registerShortcut("geoimage:deletefilefromdisk",
-                            tr("Geoimage: {0}", tr("Delete image file from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT),
-                    false, null, false);
+            setIcon(new ImageProvider("dialogs", "geoimage/deletefromdisk"));
+            setShortcut(Shortcut.registerShortcut("geoimage:deletefilefromdisk",
+                                tr("Geoimage: {0}", tr("Delete image file from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT));
+            setTooltip(tr("Delete image file from disk"));
         }
 
         @Override
@@ -354,9 +359,10 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageCopyPathAction extends JosmAction {
         ImageCopyPathAction() {
-            super(null, new ImageProvider("copy"), tr("Copy image path"), Shortcut.registerShortcut(
-                    "geoimage:copypath", tr("Geoimage: {0}", tr("Copy image path")), KeyEvent.VK_C, Shortcut.ALT_CTRL_SHIFT),
-                  false, null, false);
+            setIcon(new ImageProvider("copy"));
+            setShortcut(Shortcut.registerShortcut(
+                        "geoimage:copypath", tr("Geoimage: {0}", tr("Copy image path")), KeyEvent.VK_C, Shortcut.ALT_CTRL_SHIFT));
+            setTooltip(tr("Copy image path"));
         }
 
         @Override
@@ -369,8 +375,8 @@ public void actionPerformed(ActionEvent e) {
 
     private class ImageCollapseAction extends JosmAction {
         ImageCollapseAction() {
-            super(null, new ImageProvider("dialogs", "collapse"), tr("Move dialog to the side pane"), null,
-                  false, null, false);
+            setIcon(new ImageProvider("dialogs", "collapse"));
+            setTooltip(tr("Move dialog to the side pane"));
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
index 0041769d7..785bca1b9 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
@@ -39,7 +39,9 @@
      * @param data The GPX data used to download along
      */
     public DownloadAlongTrackAction(GpxData data) {
-        super(tr("Download from OSM along this track"), "downloadalongtrack", null, null, false);
+        setName(tr("Download from OSM along this track"));
+        setIcon("downloadalongtrack");
+        setToolbarId("downloadalongtrack");
         this.data = data;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java b/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
index f7575f772..6e45b6795 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
@@ -32,8 +32,10 @@
         private final JCheckBoxMenuItem button;
 
         MapPaintAction(StyleSource style) {
-            super(style.getDisplayString(), style.getIconProvider(),
-                    tr("Select the map painting styles"), null, true, "mappaint/" + style.getDisplayString(), true);
+            setName(style.getDisplayString());
+            setIcon(style.getIconProvider());
+            setTooltip(tr("Select the map painting styles"));
+            registerInToolbar("mappaint/" + style.getDisplayString());
             this.button = new StayOpenCheckBoxMenuItem(this);
             this.style = style;
             updateButton();
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
index cdfe3a466..a50819543 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
@@ -32,9 +32,11 @@
          * Constructs a new {@link TaggingPresetSearchPrimitiveDialog.Action}.
          */
         public Action() {
-            super(tr("Search for objects by preset..."), "dialogs/search", tr("Search for objects by their presets."),
-                    Shortcut.registerShortcut("preset:search-objects", tr("Search for objects by preset"), KeyEvent.VK_F3, Shortcut.SHIFT),
-                    false);
+            setName(tr("Search for objects by preset..."));
+            setIcon("dialogs/search");
+            setShortcut(Shortcut.registerShortcut("preset:search-objects", tr("Search for objects by preset"), KeyEvent.VK_F3, Shortcut.SHIFT));
+            setTooltip(tr("Search for objects by their presets."));
+            setToolbarId("dialogs/search");
             putValue("toolbar", "presets/search-objects");
             MainApplication.getToolbar().register(this);
         }
