Index: src/org/openstreetmap/josm/actions/CopyUrlAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/CopyUrlAction.java	(nonexistent)
+++ src/org/openstreetmap/josm/actions/CopyUrlAction.java	(working copy)
@@ -0,0 +1,65 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * User action to copy the URL of one or several object(s) to the clipboard.
+ * @since xxx
+ */
+public class CopyUrlAction extends JosmAction {
+
+    /**
+     * Constructs a new {@code CopyCoordinatesAction}.
+     */
+    public CopyUrlAction() {
+        super(tr("Copy server URLs"), "copy",
+                tr("Copy server URLs of selected objects to clipboard."),
+                Shortcut.registerShortcut("copy:urls", tr("Edit: {0}", tr("Copy server URLs")),
+                        KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
+                false);
+        setToolbarId("copy/urls");
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        final String base = Config.getUrls().getBaseBrowseUrl() + '/';
+        String string = getSelected().stream()
+                .filter(p -> !p.isNew())
+                .map(p -> base + OsmPrimitiveType.from(p).getAPIName() + '/' + p.getOsmId())
+                .collect(Collectors.joining("\n"));
+        ClipboardUtils.copyString(string);
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(!getSelected().stream().allMatch(OsmPrimitive::isNew));
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        updateEnabledState();
+    }
+
+    private Collection<OsmPrimitive> getSelected() {
+        DataSet ds = getLayerManager().getActiveDataSet();
+        if (ds == null) {
+            return Collections.emptyList();
+        } else {
+            return ds.getAllSelected();
+        }
+    }
+}
Index: src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainMenu.java	(revision 17663)
+++ src/org/openstreetmap/josm/gui/MainMenu.java	(working copy)
@@ -39,6 +39,7 @@
 import org.openstreetmap.josm.actions.CombineWayAction;
 import org.openstreetmap.josm.actions.CopyAction;
 import org.openstreetmap.josm.actions.CopyCoordinatesAction;
+import org.openstreetmap.josm.actions.CopyUrlAction;
 import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.actions.CreateMultipolygonAction;
 import org.openstreetmap.josm.actions.DeleteAction;
@@ -214,6 +215,8 @@
     public final RedoAction redo = new RedoAction();
     /** Edit / Copy */
     public final CopyAction copy = new CopyAction();
+    /** Edit / Copy URLs*/
+    public final CopyUrlAction copyUrl = new CopyUrlAction();
     /** Edit / Copy Coordinates */
     public final JosmAction copyCoordinates = new CopyCoordinatesAction();
     /** Edit / Paste */
@@ -767,6 +770,7 @@
         editMenu.addSeparator();
         add(editMenu, copy);
         add(editMenu, copyCoordinates, true);
+        add(editMenu, copyUrl, true);
         add(editMenu, paste);
         add(editMenu, pasteAtSource, true);
         add(editMenu, pasteTags);
