Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 16274)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 16275)
@@ -192,6 +192,7 @@
     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));
+    private final TaginfoAction taginfoAction = new TaginfoAction(tr("Go to Taginfo"),
+            tagTable, editHelper::getDataKey, editHelper::getDataValues,
+            membershipTable, x -> (IRelation<?>) membershipData.getValueAt(x, 0), null);
     private final Collection<TaginfoAction> taginfoNationalActions = new ArrayList<>();
     private final PasteValueAction pasteValueAction = new PasteValueAction();
@@ -365,5 +366,4 @@
         tagMenuTagInfoNatItems.forEach(tagMenu::remove);
         tagMenuTagInfoNatItems.clear();
-        taginfoNationalActions.forEach(JosmAction::destroy);
         taginfoNationalActions.clear();
     }
@@ -603,5 +603,4 @@
     @Override
     public void destroy() {
-        taginfoAction.destroy();
         destroyTaginfoNationalActions();
         super.destroy();
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TaginfoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TaginfoAction.java	(revision 16274)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TaginfoAction.java	(revision 16275)
@@ -8,10 +8,13 @@
 import java.util.Objects;
 import java.util.function.IntFunction;
+import java.util.function.Supplier;
 
+import javax.swing.AbstractAction;
 import javax.swing.JTable;
 
-import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.data.osm.IRelation;
+import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.preferences.StringProperty;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OpenBrowser;
 import org.openstreetmap.josm.tools.Utils;
@@ -21,28 +24,25 @@
  * @since 13521
  */
-public class TaginfoAction extends JosmAction {
+public class TaginfoAction extends AbstractAction {
 
     private static final StringProperty TAGINFO_URL_PROP = new StringProperty("taginfo.url", "https://taginfo.openstreetmap.org/");
 
-    private final JTable tagTable;
-    private final IntFunction<String> tagKeySupplier;
-    private final IntFunction<Map<String, Integer>> tagValuesSupplier;
-
+    private final Supplier<Tag> tagSupplier;
+    private final Supplier<String> relationTypeSupplier;
     private final String taginfoUrl;
-    private final JTable membershipTable;
-    private final IntFunction<IRelation<?>> memberValueSupplier;
 
     /**
      * Constructs a new {@code TaginfoAction}.
-     * @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)
+     * @param tagSupplier Supplies the tag for which Taginfo should be opened
+     * @param relationTypeSupplier Supplies a relation type for which Taginfo should be opened
+     * @since 16275
      */
-    public TaginfoAction(JTable tagTable, IntFunction<String> tagKeySupplier, IntFunction<Map<String, Integer>> tagValuesSupplier,
-            JTable membershipTable, IntFunction<IRelation<?>> memberValueSupplier) {
-        this(tr("Go to Taginfo"), tagTable, tagKeySupplier, tagValuesSupplier, membershipTable, memberValueSupplier, TAGINFO_URL_PROP.get());
+    public TaginfoAction(Supplier<Tag> tagSupplier, Supplier<String> relationTypeSupplier) {
+        super(tr("Go to Taginfo"));
+        new ImageProvider("dialogs/taginfo").getResource().attachImageIcon(this, true);
+        putValue(SHORT_DESCRIPTION, tr("Launch browser with Taginfo statistics for selected object"));
+        this.tagSupplier = Objects.requireNonNull(tagSupplier);
+        this.relationTypeSupplier = Objects.requireNonNull(relationTypeSupplier);
+        this.taginfoUrl = getTaginfoUrl(null);
     }
 
@@ -55,39 +55,74 @@
      * @param membershipTable The membership table. Can be null
      * @param memberValueSupplier Finds the parent relation from given row of membership table. Can be null
-     * @param taginfoUrl Taginfo URL. Cannot be null
+     * @param taginfoUrl Taginfo URL. Can be null
      * @since 15565
      */
     public TaginfoAction(String name, JTable tagTable, IntFunction<String> tagKeySupplier, IntFunction<Map<String, Integer>> tagValuesSupplier,
                          JTable membershipTable, IntFunction<IRelation<?>> memberValueSupplier, String taginfoUrl) {
-        super(name, /* ICON */ "dialogs/taginfo",
-                tr("Launch browser with Taginfo statistics for selected object"), null, false);
-        this.taginfoUrl = taginfoUrl.endsWith("/") ? taginfoUrl : taginfoUrl + '/';
-        this.tagTable = Objects.requireNonNull(tagTable);
-        this.tagKeySupplier = Objects.requireNonNull(tagKeySupplier);
-        this.tagValuesSupplier = Objects.requireNonNull(tagValuesSupplier);
-        this.membershipTable = membershipTable;
-        this.memberValueSupplier = memberValueSupplier;
+        super(name);
+        new ImageProvider("dialogs/taginfo").getResource().attachImageIcon(this, true);
+        putValue(SHORT_DESCRIPTION, tr("Launch browser with Taginfo statistics for selected object"));
+        this.taginfoUrl = getTaginfoUrl(taginfoUrl);
+        Objects.requireNonNull(tagTable);
+        Objects.requireNonNull(tagKeySupplier);
+        Objects.requireNonNull(tagValuesSupplier);
+        this.tagSupplier = () -> {
+            if (tagTable.getSelectedRowCount() == 1) {
+                final int row = tagTable.getSelectedRow();
+                final String key = Utils.encodeUrl(tagKeySupplier.apply(row)).replaceAll("\\+", "%20");
+                Map<String, Integer> values = tagValuesSupplier.apply(row);
+                String value = values.size() == 1 ? values.keySet().iterator().next() : null;
+                return new Tag(key, value);
+            }
+            return null;
+        };
+        this.relationTypeSupplier = () -> membershipTable != null && membershipTable.getSelectedRowCount() == 1
+                ? memberValueSupplier.apply(membershipTable.getSelectedRow()).get("type") : null;
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        final String url;
-        if (tagTable.getSelectedRowCount() == 1) {
-            final int row = tagTable.getSelectedRow();
-            final String key = Utils.encodeUrl(tagKeySupplier.apply(row)).replaceAll("\\+", "%20");
-            Map<String, Integer> values = tagValuesSupplier.apply(row);
-            if (values.size() == 1) {
-                url = taginfoUrl + "tags/" + key
-                        + '=' + Utils.encodeUrl(values.keySet().iterator().next()).replaceAll("\\+", "%20");
-            } else {
-                url = taginfoUrl + "keys/" + key;
-            }
-        } else if (membershipTable != null && membershipTable.getSelectedRowCount() == 1) {
-            final String type = (memberValueSupplier.apply(membershipTable.getSelectedRow())).get("type");
-            url = taginfoUrl + "relations/" + type;
-        } else {
+        Tag tag = tagSupplier.get();
+        if (tag != null) {
+            openTaginfoForTag(tag, taginfoUrl);
             return;
         }
-        OpenBrowser.displayUrl(url);
+        String type = relationTypeSupplier.get();
+        if (type != null) {
+            openTaginfoForRelationType(type, taginfoUrl);
+        }
+    }
+
+    private static String getTaginfoUrl(String taginfoUrl) {
+        if (taginfoUrl == null) {
+            taginfoUrl = TAGINFO_URL_PROP.get();
+        }
+        return taginfoUrl.endsWith("/") ? taginfoUrl : taginfoUrl + '/';
+    }
+
+    /**
+     * Opens Taginfo for the given tag or key (if the tag value is null)
+     * @param tag the tag
+     * @param taginfoUrl Taginfo URL (may be null)
+     * @since 16275
+     */
+    public static void openTaginfoForTag(Tag tag, String taginfoUrl) {
+        taginfoUrl = getTaginfoUrl(taginfoUrl);
+        if (tag.getValue().isEmpty()) {
+            OpenBrowser.displayUrl(taginfoUrl + "keys/" + tag.getKey());
+        } else {
+            OpenBrowser.displayUrl(taginfoUrl + "tags/" + tag.getKey() + '=' + Utils.encodeUrl(tag.getValue()).replaceAll("\\+", "%20"));
+        }
+    }
+
+    /**
+     * Opens Taginfo for the given relation type
+     * @param type the relation type
+     * @param taginfoUrl Taginfo URL (may be null)
+     * @since 16275
+     */
+    public static void openTaginfoForRelationType(String type, String taginfoUrl) {
+        taginfoUrl = getTaginfoUrl(taginfoUrl);
+        OpenBrowser.displayUrl(taginfoUrl + "relations/" + type);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 16274)
+++ /trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 16275)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.history;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.event.FocusEvent;
@@ -85,5 +87,5 @@
         tagMenu.addSeparator();
         tagMenu.add(trackJosmAction(new HelpTagAction(table, tagKeyFn, tagValuesFn)));
-        tagMenu.add(trackJosmAction(new TaginfoAction(table, tagKeyFn, tagValuesFn, null, null)));
+        tagMenu.add(trackJosmAction(new TaginfoAction(tr("Go to Taginfo"), table, tagKeyFn, tagValuesFn, null, null, null)));
 
         table.addMouseListener(new PopupMenuLauncher(tagMenu));
