Index: trunk/src/org/openstreetmap/josm/actions/OpenBrowserAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OpenBrowserAction.java	(revision 16838)
+++ trunk/src/org/openstreetmap/josm/actions/OpenBrowserAction.java	(revision 16839)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ImageResource;
 import org.openstreetmap.josm.tools.OpenBrowser;
 import org.openstreetmap.josm.tools.Utils;
@@ -37,5 +38,20 @@
      */
     public OpenBrowserAction(String name, String url) {
-        new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
+        this(name, url, null);
+    }
+
+    /**
+     * Constructs a new {@link OpenBrowserAction}.
+     * @param name the name of this action
+     * @param url the URL to launch
+     * @param icon the action icon
+     * @since 16839
+     */
+    public OpenBrowserAction(String name, String url, ImageResource icon) {
+        if (icon == null) {
+            new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
+        } else {
+            icon.attachImageIcon(this, true);
+        }
         this.urls.add(url);
         this.originalName = name;
Index: trunk/src/org/openstreetmap/josm/gui/util/AbstractTag2LinkPopupListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AbstractTag2LinkPopupListener.java	(revision 16838)
+++ trunk/src/org/openstreetmap/josm/gui/util/AbstractTag2LinkPopupListener.java	(revision 16839)
@@ -41,5 +41,5 @@
 
     protected void addLinks(JPopupMenu popup, String key, String value) {
-        Tag2Link.getLinksForTag(key, value, (name, url) -> {
+        Tag2Link.getLinksForTag(key, value, (name, url, icon) -> {
             if (itemList.isEmpty()) {
                 itemList.add(popup.add(new JPopupMenu.Separator()));
@@ -49,5 +49,5 @@
                 browserActions.get(name).addUrl(url);
             } else {
-                final OpenBrowserAction action = new OpenBrowserAction(name, url);
+                final OpenBrowserAction action = new OpenBrowserAction(name, url, icon);
                 browserActions.put(name, action);
                 itemList.add(popup.add(action));
Index: trunk/src/org/openstreetmap/josm/tools/Tag2Link.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Tag2Link.java	(revision 16838)
+++ trunk/src/org/openstreetmap/josm/tools/Tag2Link.java	(revision 16839)
@@ -11,6 +11,9 @@
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.function.Supplier;
 import java.util.function.UnaryOperator;
 import java.util.regex.Matcher;
@@ -23,4 +26,5 @@
 import javax.json.JsonValue;
 
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.preferences.CachingProperty;
@@ -77,6 +81,7 @@
          * @param name the name/label of the link
          * @param url the URL of the link
+         * @param icon the icon to use
          */
-        void acceptLink(String name, String url);
+        void acceptLink(String name, String url, ImageResource icon);
     }
 
@@ -142,8 +147,14 @@
         }
 
+        final HashMap<OsmPrimitiveType, Optional<ImageResource>> memoize = new HashMap<>();
+        final Supplier<ImageResource> imageResource = () -> memoize
+                .computeIfAbsent(OsmPrimitiveType.NODE, type -> OsmPrimitiveImageProvider.getResource(key, value, type))
+                .orElse(null);
+
         // Search
         if (key.matches("^(.+[:_])?name([:_]" + languagePattern + ")?$")) {
+            final ImageResource search = new ImageProvider("dialogs/search").getResource();
             PREF_SEARCH_ENGINES.get().forEach(url ->
-                    linkConsumer.acceptLink(tr("Search on {0}", getHost(url, url)), url.replace("$1", Utils.encodeUrl(value))));
+                    linkConsumer.acceptLink(tr("Search on {0}", getHost(url, url)), url.replace("$1", Utils.encodeUrl(value)), search));
         }
 
@@ -155,14 +166,14 @@
                 : null;
         if (key.matches("^(.+[:_])?website([:_].+)?$") && validURL != null) {
-            linkConsumer.acceptLink(getLinkName(validURL, key), validURL);
+            linkConsumer.acceptLink(getLinkName(validURL, key), validURL, imageResource.get());
         }
         if (key.matches("^(.+[:_])?source([:_].+)?$") && validURL != null) {
-            linkConsumer.acceptLink(getLinkName(validURL, key), validURL);
+            linkConsumer.acceptLink(getLinkName(validURL, key), validURL, imageResource.get());
         }
         if (key.matches("^(.+[:_])?url([:_].+)?$") && validURL != null) {
-            linkConsumer.acceptLink(getLinkName(validURL, key), validURL);
+            linkConsumer.acceptLink(getLinkName(validURL, key), validURL, imageResource.get());
         }
         if (key.matches("image") && validURL != null) {
-            linkConsumer.acceptLink(tr("View image"), validURL);
+            linkConsumer.acceptLink(tr("View image"), validURL, imageResource.get());
         }
 
@@ -173,19 +184,21 @@
             final String lang = Utils.firstNotEmptyString("en", keyMatcher.group("lang"), valueMatcher.group("lang"));
             final String url = "https://" + lang + ".wikipedia.org/wiki/" + valueMatcher.group("article").replace(' ', '_');
-            linkConsumer.acceptLink(tr("View Wikipedia article"), url);
+            linkConsumer.acceptLink(tr("View Wikipedia article"), url, imageResource.get());
         }
         if (key.matches("(.*:)?wikidata")) {
             OsmUtils.splitMultipleValues(value)
-                    .forEach(q -> linkConsumer.acceptLink(tr("View Wikidata item"), "https://www.wikidata.org/wiki/" + q));
+                    .forEach(q -> linkConsumer.acceptLink(tr("View Wikidata item"), "https://www.wikidata.org/wiki/" + q, imageResource.get()));
         }
         if (key.matches("(.*:)?species")) {
             final String url = "https://species.wikimedia.org/wiki/" + value;
-            linkConsumer.acceptLink(getLinkName(url, key), url);
+            linkConsumer.acceptLink(getLinkName(url, key), url, imageResource.get());
         }
         if (key.matches("wikimedia_commons|image") && value.matches("(?i:File):.*")) {
-            linkConsumer.acceptLink(tr("View image on Wikimedia Commons"), "https://commons.wikimedia.org/wiki/" + value);
+            String url = "https://commons.wikimedia.org/wiki/" + value;
+            linkConsumer.acceptLink(tr("View image on Wikimedia Commons"), url, imageResource.get());
         }
         if (key.matches("wikimedia_commons|image") && value.matches("(?i:Category):.*")) {
-            linkConsumer.acceptLink(tr("View category on Wikimedia Commons"), "https://commons.wikimedia.org/wiki/" + value);
+            String url = "https://commons.wikimedia.org/wiki/" + value;
+            linkConsumer.acceptLink(tr("View category on Wikimedia Commons"), url, imageResource.get());
         }
 
@@ -193,5 +206,5 @@
             final String formattedValue = valueFormatter.getOrDefault(key, x -> x).apply(value);
             final String url = urlFormatter.replace("$1", formattedValue);
-            linkConsumer.acceptLink(getLinkName(url, key), url);
+            linkConsumer.acceptLink(getLinkName(url, key), url, imageResource.get());
         });
     }
