Index: trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 15705)
+++ trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 15706)
@@ -3,5 +3,4 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.event.ActionEvent;
@@ -16,9 +15,5 @@
 import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.help.HelpUtil;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OpenBrowser;
@@ -62,38 +57,9 @@
      * @param numBrowsers the number of browser windows to open
      * @return {@code true} if the user confirms, {@code false} otherwise
+     * @deprecated use {@link OpenBrowserAction#confirmLaunchMultiple(int)}
      */
+    @Deprecated
     public static boolean confirmLaunchMultiple(int numBrowsers) {
-        String msg = /* for correct i18n of plural forms - see #9110 */ trn(
-                "You are about to launch {0} browser window.<br>"
-                        + "This may both clutter your screen with browser windows<br>"
-                        + "and take some time to finish.",
-                "You are about to launch {0} browser windows.<br>"
-                        + "This may both clutter your screen with browser windows<br>"
-                        + "and take some time to finish.", numBrowsers, numBrowsers);
-        ButtonSpec[] spec = {
-                new ButtonSpec(
-                        tr("Continue"),
-                        new ImageProvider("ok"),
-                        trn("Click to continue and to open {0} browser", "Click to continue and to open {0} browsers",
-                                numBrowsers, numBrowsers),
-                        null // no specific help topic
-                ),
-                new ButtonSpec(
-                        tr("Cancel"),
-                        new ImageProvider("cancel"),
-                        tr("Click to abort launching external browsers"),
-                        null // no specific help topic
-                )
-        };
-        return 0 == HelpAwareOptionPane.showOptionDialog(
-                MainApplication.getMainFrame(),
-                new StringBuilder(msg).insert(0, "<html>").append("</html>").toString(),
-                tr("Warning"),
-                JOptionPane.WARNING_MESSAGE,
-                null,
-                spec,
-                spec[0],
-                HelpUtil.ht("/WarningMessages#ToManyBrowsersToOpen")
-        );
+        return OpenBrowserAction.confirmLaunchMultiple(numBrowsers);
     }
 
@@ -124,5 +90,5 @@
         //
         int max = Math.min(10, primitivesToShow.size());
-        if (primitivesToShow.size() > max && !confirmLaunchMultiple(primitivesToShow.size()))
+        if (primitivesToShow.size() > max && !OpenBrowserAction.confirmLaunchMultiple(primitivesToShow.size()))
             return;
         for (int i = 0; i < max; i++) {
Index: trunk/src/org/openstreetmap/josm/actions/OpenBrowserAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OpenBrowserAction.java	(revision 15706)
+++ trunk/src/org/openstreetmap/josm/actions/OpenBrowserAction.java	(revision 15706)
@@ -0,0 +1,110 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.ActionEvent;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.gui.HelpAwareOptionPane;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.OpenBrowser;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Action to open browser on given URL.
+ * @see OpenBrowser
+ * @since 15706
+ */
+public class OpenBrowserAction extends AbstractAction {
+
+    private final List<String> urls = new ArrayList<>();
+    private final String originalName;
+
+    /**
+     * Constructs a new {@link OpenBrowserAction}.
+     * @param name the name of this action
+     * @param url the URL to launch
+     */
+    public OpenBrowserAction(String name, String url) {
+        new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
+        this.urls.add(url);
+        this.originalName = name;
+        updateNameAndDescription();
+    }
+
+    /**
+     * Adds an additional URL to be launched.
+     * @param url the URL to launch
+     */
+    public void addUrl(String url) {
+        urls.add(url);
+        updateNameAndDescription();
+    }
+
+    private void updateNameAndDescription() {
+        final Serializable countString = urls.size() > 1 ? tr(" ({0})", urls.size()) : "";
+        putValue(NAME, originalName + countString);
+        putValue(SHORT_DESCRIPTION, Utils.shortenString(tr("Open {0}", String.join(", ", urls)), 256));
+
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        final int size = urls.size();
+        if (size > 10 && !confirmLaunchMultiple(size)) {
+            return;
+        }
+        for (String url : urls) {
+            OpenBrowser.displayUrl(url);
+        }
+    }
+
+    /**
+     * Asks user confirmation before launching a large number of browser windows.
+     * @param numBrowsers the number of browser windows to open
+     * @return {@code true} if the user confirms, {@code false} otherwise
+     */
+    public static boolean confirmLaunchMultiple(int numBrowsers) {
+        String msg = /* for correct i18n of plural forms - see #9110 */ trn(
+                "You are about to launch {0} browser window.<br>"
+                        + "This may both clutter your screen with browser windows<br>"
+                        + "and take some time to finish.",
+                "You are about to launch {0} browser windows.<br>"
+                        + "This may both clutter your screen with browser windows<br>"
+                        + "and take some time to finish.", numBrowsers, numBrowsers);
+        HelpAwareOptionPane.ButtonSpec[] spec = {
+                new HelpAwareOptionPane.ButtonSpec(
+                        tr("Continue"),
+                        new ImageProvider("ok"),
+                        trn("Click to continue and to open {0} browser", "Click to continue and to open {0} browsers",
+                                numBrowsers, numBrowsers),
+                        null // no specific help topic
+                ),
+                new HelpAwareOptionPane.ButtonSpec(
+                        tr("Cancel"),
+                        new ImageProvider("cancel"),
+                        tr("Click to abort launching external browsers"),
+                        null // no specific help topic
+                )
+        };
+        return 0 == HelpAwareOptionPane.showOptionDialog(
+                MainApplication.getMainFrame(),
+                new StringBuilder(msg).insert(0, "<html>").append("</html>").toString(),
+                tr("Warning"),
+                JOptionPane.WARNING_MESSAGE,
+                null,
+                spec,
+                spec[0],
+                HelpUtil.ht("/WarningMessages#ToManyBrowsersToOpen")
+        );
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 15705)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 15706)
@@ -33,5 +33,5 @@
 import javax.swing.event.ListSelectionListener;
 
-import org.openstreetmap.josm.actions.AbstractInfoAction;
+import org.openstreetmap.josm.actions.OpenBrowserAction;
 import org.openstreetmap.josm.actions.downloadtasks.ChangesetHeaderDownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
@@ -432,5 +432,5 @@
             if (sel.isEmpty())
                 return;
-            if (sel.size() > 10 && !AbstractInfoAction.confirmLaunchMultiple(sel.size()))
+            if (sel.size() > 10 && !OpenBrowserAction.confirmLaunchMultiple(sel.size()))
                 return;
             String baseUrl = Config.getUrls().getBaseBrowseUrl();
Index: trunk/src/org/openstreetmap/josm/gui/history/OpenChangesetPopupMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/OpenChangesetPopupMenu.java	(revision 15705)
+++ trunk/src/org/openstreetmap/josm/gui/history/OpenChangesetPopupMenu.java	(revision 15706)
@@ -15,8 +15,8 @@
 import javax.swing.JPopupMenu;
 
+import org.openstreetmap.josm.actions.OpenBrowserAction;
 import org.openstreetmap.josm.data.StructUtils;
 import org.openstreetmap.josm.data.StructUtils.StructEntry;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.gui.util.OpenBrowserAction;
 import org.openstreetmap.josm.spi.preferences.Config;
 
Index: trunk/src/org/openstreetmap/josm/gui/util/AbstractTag2LinkPopupListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AbstractTag2LinkPopupListener.java	(revision 15705)
+++ trunk/src/org/openstreetmap/josm/gui/util/AbstractTag2LinkPopupListener.java	(revision 15706)
@@ -4,5 +4,7 @@
 import java.awt.Component;
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.swing.JPopupMenu;
@@ -10,4 +12,5 @@
 import javax.swing.event.PopupMenuListener;
 
+import org.openstreetmap.josm.actions.OpenBrowserAction;
 import org.openstreetmap.josm.tools.Tag2Link;
 
@@ -19,8 +22,8 @@
 public abstract class AbstractTag2LinkPopupListener implements PopupMenuListener {
 
-    private final List<Component> itemList;
+    private final Map<String, org.openstreetmap.josm.actions.OpenBrowserAction> browserActions = new HashMap<>();
+    private final Collection<Component> itemList = new ArrayList<>();
 
     protected AbstractTag2LinkPopupListener() {
-        this.itemList = new ArrayList<>();
     }
 
@@ -28,4 +31,5 @@
     public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
         JPopupMenu popup = (JPopupMenu) e.getSource();
+        browserActions.clear();
         itemList.forEach(popup::remove);
         itemList.clear();
@@ -42,5 +46,11 @@
             }
 
-            itemList.add(popup.add(new OpenBrowserAction(name, url)));
+            if (browserActions.containsKey(name)) {
+                browserActions.get(name).addUrl(url);
+            } else {
+                final OpenBrowserAction action = new OpenBrowserAction(name, url);
+                browserActions.put(name, action);
+                itemList.add(popup.add(action));
+            }
         });
     }
Index: trunk/src/org/openstreetmap/josm/gui/util/OpenBrowserAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/OpenBrowserAction.java	(revision 15705)
+++ 	(revision )
@@ -1,38 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.AbstractAction;
-
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.OpenBrowser;
-
-/**
- * Action to open browser on given URL.
- * @see OpenBrowser
- * @since 15673
- */
-public class OpenBrowserAction extends AbstractAction {
-
-    private final String url;
-
-    /**
-     * Constructs a new {@link OpenBrowserAction}.
-     * @param name the name of this action
-     * @param url the URL to launch
-     */
-    public OpenBrowserAction(String name, String url) {
-        super(name);
-        putValue(SHORT_DESCRIPTION, tr("Open {0}", url));
-        new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
-        this.url = url;
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        OpenBrowser.displayUrl(url);
-    }
-}
Index: trunk/src/org/openstreetmap/josm/tools/Tag2Link.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Tag2Link.java	(revision 15705)
+++ trunk/src/org/openstreetmap/josm/tools/Tag2Link.java	(revision 15706)
@@ -122,4 +122,8 @@
     public static void getLinksForTag(String key, String value, LinkConsumer linkConsumer) {
 
+        if (value == null || value.isEmpty()) {
+            return;
+        }
+
         // Search
         if (key.matches("^(.+[:_])?name([:_].+)?$")) {
@@ -151,5 +155,5 @@
         if (key.matches("(.*:)?wikidata")) {
             OsmUtils.splitMultipleValues(value)
-                    .forEach(q -> linkConsumer.acceptLink(tr("View Wikidata item {0}", q), "https://www.wikidata.org/wiki/" + q));
+                    .forEach(q -> linkConsumer.acceptLink(tr("View Wikidata item"), "https://www.wikidata.org/wiki/" + q));
         }
         if (key.matches("(.*:)?species")) {
