Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 16595)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 16596)
@@ -195,4 +195,5 @@
             tagTable, editHelper::getDataKey, editHelper::getDataValues,
             membershipTable, x -> (IRelation<?>) membershipData.getValueAt(x, 0), null);
+    private final TaginfoAction tagHistoryAction = taginfoAction.toTagHistoryAction();
     private final Collection<TaginfoAction> taginfoNationalActions = new ArrayList<>();
     private final PasteValueAction pasteValueAction = new PasteValueAction();
@@ -457,4 +458,5 @@
         tagMenu.addSeparator();
         tagMenu.add(helpTagAction);
+        tagMenu.add(tagHistoryAction);
         tagMenu.add(taginfoAction);
         tagMenu.addPopupMenuListener(new AbstractTag2LinkPopupListener() {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TaginfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TaginfoAction.java	(revision 16595)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TaginfoAction.java	(revision 16596)
@@ -27,8 +27,16 @@
 
     private static final StringProperty TAGINFO_URL_PROP = new StringProperty("taginfo.url", "https://taginfo.openstreetmap.org/");
+    private static final StringProperty TAG_HISTORY_URL_PROP = new StringProperty("taghistory.url", "https://taghistory.raifer.tech/#***");
 
     private final Supplier<Tag> tagSupplier;
     private final Supplier<String> relationTypeSupplier;
-    private final String taginfoUrl;
+    protected final String taginfoUrl;
+
+    private TaginfoAction(String name, Supplier<Tag> tagSupplier, Supplier<String> relationTypeSupplier, String taginfoUrl) {
+        super(name);
+        this.tagSupplier = tagSupplier;
+        this.relationTypeSupplier = relationTypeSupplier;
+        this.taginfoUrl = taginfoUrl;
+    }
 
     /**
@@ -85,10 +93,10 @@
         Tag tag = tagSupplier.get();
         if (tag != null) {
-            openTaginfoForTag(tag, taginfoUrl);
+            OpenBrowser.displayUrl(getTaginfoUrlForTag(tag));
             return;
         }
         String type = relationTypeSupplier.get();
         if (type != null) {
-            openTaginfoForRelationType(type, taginfoUrl);
+            OpenBrowser.displayUrl(getTaginfoUrlForRelationType(type));
         }
     }
@@ -98,5 +106,9 @@
             taginfoUrl = TAGINFO_URL_PROP.get();
         }
-        return taginfoUrl.endsWith("/") ? taginfoUrl : taginfoUrl + '/';
+        return withoutTrailingSlash(taginfoUrl);
+    }
+
+    private static String withoutTrailingSlash(String url) {
+        return Utils.strip(url, "/");
     }
 
@@ -104,13 +116,11 @@
      * 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
+     * @since 16596
      */
-    public static void openTaginfoForTag(Tag tag, String taginfoUrl) {
-        taginfoUrl = getTaginfoUrl(taginfoUrl);
+    public String getTaginfoUrlForTag(Tag tag) {
         if (tag.getValue().isEmpty()) {
-            OpenBrowser.displayUrl(taginfoUrl + "keys/" + tag.getKey());
+            return taginfoUrl + "/keys/" + tag.getKey();
         } else {
-            OpenBrowser.displayUrl(taginfoUrl + "tags/" + tag.getKey() + '=' + Utils.encodeUrl(tag.getValue()).replaceAll("\\+", "%20"));
+            return taginfoUrl + "/tags/" + tag.getKey() + '=' + Utils.encodeUrl(tag.getValue()).replaceAll("\\+", "%20");
         }
     }
@@ -119,10 +129,28 @@
      * Opens Taginfo for the given relation type
      * @param type the relation type
-     * @param taginfoUrl Taginfo URL (may be null)
-     * @since 16275
+     * @since 16596
      */
-    public static void openTaginfoForRelationType(String type, String taginfoUrl) {
-        taginfoUrl = getTaginfoUrl(taginfoUrl);
-        OpenBrowser.displayUrl(taginfoUrl + "relations/" + type);
+    public String getTaginfoUrlForRelationType(String type) {
+        return taginfoUrl + "/relations/" + type;
+    }
+
+    /**
+     * Returns a new action which launches https://taghistory.raifer.tech/ for the given tag
+     * @return a new action
+     * @since 16596
+     */
+    public TaginfoAction toTagHistoryAction() {
+        String url = withoutTrailingSlash(TAG_HISTORY_URL_PROP.get());
+        return new TaginfoAction(tr("Go to OSM Tag History"), tagSupplier, relationTypeSupplier, url) {
+            @Override
+            public String getTaginfoUrlForTag(Tag tag) {
+                return String.join("/", taginfoUrl, tag.getKey(), tag.getValue());
+            }
+
+            @Override
+            public String getTaginfoUrlForRelationType(String type) {
+                return null;
+            }
+        };
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 16595)
+++ trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 16596)
@@ -100,5 +100,7 @@
         tagMenu.addSeparator();
         tagMenu.add(trackJosmAction(new HelpTagAction(table, tagKeyFn, tagValuesFn)));
-        tagMenu.add(trackJosmAction(new TaginfoAction(tr("Go to Taginfo"), table, tagKeyFn, tagValuesFn, null, null, null)));
+        TaginfoAction taginfoAction = new TaginfoAction(tr("Go to Taginfo"), table, tagKeyFn, tagValuesFn, null, null, null);
+        tagMenu.add(trackJosmAction(taginfoAction.toTagHistoryAction()));
+        tagMenu.add(trackJosmAction(taginfoAction));
 
         table.addMouseListener(new PopupMenuLauncher(tagMenu));
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java	(revision 16595)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java	(revision 16596)
@@ -214,5 +214,7 @@
         popupMenu.add(tr("Key: {0}", key)).setEnabled(false);
         popupMenu.add(new HelpTagAction(() -> tag));
-        popupMenu.add(new TaginfoAction(() -> tag, () -> null));
+        TaginfoAction taginfoAction = new TaginfoAction(() -> tag, () -> null);
+        popupMenu.add(taginfoAction.toTagHistoryAction());
+        popupMenu.add(taginfoAction);
         return popupMenu;
     }
Index: trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/TaginfoActionTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/TaginfoActionTest.java	(revision 16596)
+++ trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/TaginfoActionTest.java	(revision 16596)
@@ -0,0 +1,44 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+public class TaginfoActionTest {
+
+    /**
+     * Setup test.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules();
+
+    /**
+     * Unit test of {@link TaginfoAction#getTaginfoUrlForTag} and {@link TaginfoAction#getTaginfoUrlForRelationType}
+     */
+    @Test
+    public void testTaginfoUrls() {
+        TaginfoAction action = new TaginfoAction(() -> null, () -> null);
+        assertEquals("https://taginfo.openstreetmap.org/keys/railway", action.getTaginfoUrlForTag(new Tag("railway")));
+        assertEquals("https://taginfo.openstreetmap.org/tags/railway=tram", action.getTaginfoUrlForTag(new Tag("railway", "tram")));
+        assertEquals("https://taginfo.openstreetmap.org/relations/route", action.getTaginfoUrlForRelationType("route"));
+    }
+
+    /**
+     * Unit test of {@link TaginfoAction#toTagHistoryAction()}
+     */
+    @Test
+    public void testTagHistoryUrls() {
+        TaginfoAction action = new TaginfoAction(() -> null, () -> null).toTagHistoryAction();
+        assertEquals("https://taghistory.raifer.tech/#***/railway/", action.getTaginfoUrlForTag(new Tag("railway")));
+        assertEquals("https://taghistory.raifer.tech/#***/railway/tram", action.getTaginfoUrlForTag(new Tag("railway", "tram")));
+        assertNull(action.getTaginfoUrlForRelationType("route"));
+    }
+}
