Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpAction.java	(revision 15580)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpAction.java	(revision 15581)
@@ -10,10 +10,6 @@
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.IntFunction;
 
 import javax.swing.AbstractAction;
-import javax.swing.JTable;
 import javax.swing.KeyStroke;
 import javax.xml.parsers.ParserConfigurationException;
@@ -35,29 +31,10 @@
  * @since 13521
  */
-public class HelpAction extends AbstractAction {
-    private final JTable tagTable;
-    private final IntFunction<String> tagKeySupplier;
-    private final IntFunction<Map<String, Integer>> tagValuesSupplier;
-
-    private final JTable membershipTable;
-    private final IntFunction<IRelation<?>> memberValueSupplier;
+public abstract class HelpAction extends AbstractAction {
 
     /**
      * Constructs a new {@code HelpAction}.
-     * @param tagTable The tag table. Cannot be null
-     * @param tagKeySupplier Finds the key from given row of tag table. Cannot be null
-     * @param tagValuesSupplier Finds the values from given row of tag table (map of values and number of occurrences). Cannot be null
-     * @param membershipTable The membership table. Can be null
-     * @param memberValueSupplier Finds the parent relation from given row of membership table. Can be null
-     * @since 13959 (signature)
      */
-    public HelpAction(JTable tagTable, IntFunction<String> tagKeySupplier, IntFunction<Map<String, Integer>> tagValuesSupplier,
-            JTable membershipTable, IntFunction<IRelation<?>> memberValueSupplier) {
-        this.tagTable = Objects.requireNonNull(tagTable);
-        this.tagKeySupplier = Objects.requireNonNull(tagKeySupplier);
-        this.tagValuesSupplier = Objects.requireNonNull(tagValuesSupplier);
-        this.membershipTable = membershipTable;
-        this.memberValueSupplier = memberValueSupplier;
-        putValue(NAME, tr("Go to OSM wiki for tag help"));
+    public HelpAction() {
         putValue(SHORT_DESCRIPTION, tr("Launch browser with wiki help for selected object"));
         new ImageProvider("dialogs", "search").getResource().attachImageIcon(this, true);
@@ -69,5 +46,5 @@
      * @return the keystroke launching this action
      */
-    public KeyStroke getKeyStroke() {
+    public static KeyStroke getKeyStroke() {
         return KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0);
     }
@@ -75,20 +52,6 @@
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (tagTable.getSelectedRowCount() == 1) {
-            int row = tagTable.getSelectedRow();
-            String key = tagKeySupplier.apply(row);
-            Map<String, Integer> m = tagValuesSupplier.apply(row);
-            if (!m.isEmpty()) {
-                String val = m.entrySet().iterator().next().getKey();
-                MainApplication.worker.execute(() -> displayTagHelp(key, val));
-            }
-        } else if (membershipTable != null && membershipTable.getSelectedRowCount() == 1) {
-            int row = membershipTable.getSelectedRow();
-            final IRelation<?> relation = memberValueSupplier.apply(row);
-            MainApplication.worker.execute(() -> displayRelationHelp(relation));
-        } else {
-            // give the generic help page, if more than one element is selected
-            MainApplication.worker.execute(HelpAction::displayGenericHelp);
-        }
+        // give the generic help page, if more than one element is selected
+        MainApplication.worker.execute(HelpAction::displayGenericHelp);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpMembershipAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpMembershipAction.java	(revision 15581)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpMembershipAction.java	(revision 15581)
@@ -0,0 +1,44 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.properties;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.Objects;
+import java.util.function.IntFunction;
+
+import javax.swing.JTable;
+
+import org.openstreetmap.josm.data.osm.IRelation;
+import org.openstreetmap.josm.gui.MainApplication;
+
+/**
+ * Launch browser with wiki help for selected membership.
+ * @since 15581
+ */
+public class HelpMembershipAction extends HelpAction {
+    private final JTable membershipTable;
+    private final IntFunction<IRelation<?>> memberValueSupplier;
+
+    /**
+     * Constructs a new {@code HelpAction}.
+     * @param membershipTable The membership table. Can be null
+     * @param memberValueSupplier Finds the parent relation from given row of membership table. Can be null
+     */
+    public HelpMembershipAction(JTable membershipTable, IntFunction<IRelation<?>> memberValueSupplier) {
+        this.membershipTable = Objects.requireNonNull(membershipTable);
+        this.memberValueSupplier = Objects.requireNonNull(memberValueSupplier);
+        putValue(NAME, tr("Go to OSM wiki for relation help"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (membershipTable.getSelectedRowCount() == 1) {
+            int row = membershipTable.getSelectedRow();
+            final IRelation<?> relation = memberValueSupplier.apply(row);
+            MainApplication.worker.execute(() -> displayRelationHelp(relation));
+        } else {
+            super.actionPerformed(e);
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpTagAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpTagAction.java	(revision 15581)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/HelpTagAction.java	(revision 15581)
@@ -0,0 +1,51 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.properties;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.IntFunction;
+
+import javax.swing.JTable;
+
+import org.openstreetmap.josm.gui.MainApplication;
+
+/**
+ * Launch browser with wiki help for selected tag.
+ * @since 15581
+ */
+public class HelpTagAction extends HelpAction {
+    private final JTable tagTable;
+    private final IntFunction<String> tagKeySupplier;
+    private final IntFunction<Map<String, Integer>> tagValuesSupplier;
+
+    /**
+     * Constructs a new {@code HelpAction}.
+     * @param tagTable The tag table. Cannot be null
+     * @param tagKeySupplier Finds the key from given row of tag table. Cannot be null
+     * @param tagValuesSupplier Finds the values from given row of tag table (map of values and number of occurrences). Cannot be null
+     */
+    public HelpTagAction(JTable tagTable, IntFunction<String> tagKeySupplier, IntFunction<Map<String, Integer>> tagValuesSupplier) {
+        this.tagTable = Objects.requireNonNull(tagTable);
+        this.tagKeySupplier = Objects.requireNonNull(tagKeySupplier);
+        this.tagValuesSupplier = Objects.requireNonNull(tagValuesSupplier);
+        putValue(NAME, tr("Go to OSM wiki for tag help"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (tagTable.getSelectedRowCount() == 1) {
+            int row = tagTable.getSelectedRow();
+            String key = tagKeySupplier.apply(row);
+            Map<String, Integer> m = tagValuesSupplier.apply(row);
+            if (!m.isEmpty()) {
+                String val = m.entrySet().iterator().next().getKey();
+                MainApplication.worker.execute(() -> displayTagHelp(key, val));
+            }
+        } else {
+            super.actionPerformed(e);
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 15580)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 15581)
@@ -185,6 +185,6 @@
 
     private final transient DataSetListenerAdapter dataChangedAdapter = new DataSetListenerAdapter(this);
-    private final HelpAction helpAction = new HelpAction(tagTable, editHelper::getDataKey, editHelper::getDataValues,
-            membershipTable, x -> (IRelation<?>) membershipData.getValueAt(x, 0));
+    private final HelpAction helpTagAction = new HelpTagAction(tagTable, editHelper::getDataKey, editHelper::getDataValues);
+    private final HelpAction helpRelAction = new HelpMembershipAction(membershipTable, x -> (IRelation<?>) membershipData.getValueAt(x, 0));
     private final TaginfoAction taginfoAction = new TaginfoAction(tagTable, editHelper::getDataKey, editHelper::getDataValues,
             membershipTable, x -> (IRelation<?>) membershipData.getValueAt(x, 0));
@@ -389,5 +389,5 @@
         RelationPopupMenus.setupHandler(membershipMenuHandler, EditRelationAction.class, DeleteRelationsAction.class);
         membershipMenu.addSeparator();
-        membershipMenu.add(helpAction);
+        membershipMenu.add(helpRelAction);
         membershipMenu.add(taginfoAction);
 
@@ -441,5 +441,5 @@
         tagMenu.add(searchActionSame);
         tagMenu.addSeparator();
-        tagMenu.add(helpAction);
+        tagMenu.add(helpTagAction);
         tagMenu.add(taginfoAction);
         tagTable.addMouseListener(new PopupMenuLauncher(tagMenu));
@@ -486,6 +486,15 @@
         // F1 button = custom help action
         getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
-                helpAction.getKeyStroke(), "onHelp");
-        getActionMap().put("onHelp", helpAction);
+                HelpAction.getKeyStroke(), "onHelp");
+        getActionMap().put("onHelp", new AbstractAction() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (membershipTable.getSelectedRowCount() == 1) {
+                    helpRelAction.actionPerformed(e);
+                } else {
+                    helpTagAction.actionPerformed(e);
+                }
+            }
+        });
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 15580)
+++ trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 15581)
@@ -20,5 +20,5 @@
 import org.openstreetmap.josm.gui.dialogs.properties.CopyKeyValueAction;
 import org.openstreetmap.josm.gui.dialogs.properties.CopyValueAction;
-import org.openstreetmap.josm.gui.dialogs.properties.HelpAction;
+import org.openstreetmap.josm.gui.dialogs.properties.HelpTagAction;
 import org.openstreetmap.josm.gui.dialogs.properties.TaginfoAction;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
@@ -95,5 +95,5 @@
         tagMenu.add(trackJosmAction(new CopyAllKeyValueAction(table, tagKeyFn, objectSp)));
         tagMenu.addSeparator();
-        tagMenu.add(trackJosmAction(new HelpAction(table, tagKeyFn, tagValuesFn, null, null)));
+        tagMenu.add(trackJosmAction(new HelpTagAction(table, tagKeyFn, tagValuesFn)));
         tagMenu.add(trackJosmAction(new TaginfoAction(table, tagKeyFn, tagValuesFn, null, null)));
 
