diff --git a/src/org/openstreetmap/josm/gui/GettingStarted.java b/src/org/openstreetmap/josm/gui/GettingStarted.java
index 3c05eea..f04b348 100644
--- a/src/org/openstreetmap/josm/gui/GettingStarted.java
+++ b/src/org/openstreetmap/josm/gui/GettingStarted.java
@@ -23,7 +23,7 @@ import javax.swing.event.HyperlinkListener;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Version;
-import org.openstreetmap.josm.gui.datatransfer.FileTransferHandler;
+import org.openstreetmap.josm.gui.datatransfer.OpenTransferHandler;
 import org.openstreetmap.josm.gui.preferences.server.ProxyPreference;
 import org.openstreetmap.josm.gui.preferences.server.ProxyPreferenceListener;
 import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
@@ -132,7 +132,7 @@ public final class GettingStarted extends JPanel implements ProxyPreferenceListe
 
         getMOTD();
 
-        setTransferHandler(new FileTransferHandler());
+        setTransferHandler(new OpenTransferHandler());
     }
 
     private void getMOTD() {
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/AbstractStackTransferHandler.java b/src/org/openstreetmap/josm/gui/datatransfer/AbstractStackTransferHandler.java
new file mode 100644
index 0000000..de50169
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/datatransfer/AbstractStackTransferHandler.java
@@ -0,0 +1,64 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer;
+
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+import java.util.Collection;
+
+import javax.swing.JComponent;
+import javax.swing.TransferHandler;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.gui.datatransfer.importers.AbstractOsmDataPaster;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.bugreport.BugReport;
+
+/**
+ * A transfer handler class that allows you to manage a prioritized stack of transfer handlers.
+ * @author Michael Zangl
+ * @since xxx
+ */
+public abstract class AbstractStackTransferHandler extends TransferHandler {
+
+    protected abstract Collection<AbstractOsmDataPaster> getSupportedPasters();
+
+    @Override
+    public int getSourceActions(JComponent c) {
+        return COPY;
+    }
+
+    @Override
+    public boolean canImport(TransferSupport support) {
+        // import everything for now, only support copy.
+        for (AbstractOsmDataPaster df : getSupportedPasters()) {
+            if (df.supports(support)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean importData(TransferSupport support) {
+        return importData(support, Main.getLayerManager().getEditLayer(), null);
+    }
+
+    protected boolean importData(TransferSupport support, OsmDataLayer layer, EastNorth center) {
+        for (AbstractOsmDataPaster df : getSupportedPasters()) {
+            if (df.supports(support)) {
+                try {
+                    if (df.importData(support, layer, center)) {
+                        return true;
+                    }
+                } catch (UnsupportedFlavorException | IOException e) {
+                    Main.warn(e);
+                } catch (RuntimeException e) {
+                    BugReport.intercept(e).put("paster", df).put("flavors", () -> support.getDataFlavors()).warn();
+                }
+            }
+        }
+        return super.importData(support);
+    }
+
+}
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/FileTransferHandler.java b/src/org/openstreetmap/josm/gui/datatransfer/FileTransferHandler.java
deleted file mode 100644
index 2274dfe..0000000
--- a/src/org/openstreetmap/josm/gui/datatransfer/FileTransferHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.datatransfer;
-
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.IOException;
-
-import javax.swing.JComponent;
-import javax.swing.TransferHandler;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.datatransfer.importers.FilePaster;
-
-/**
- * This transfer handler allows to drop files to open them.
- *
- * @author Michael Zangl
- * @since 10620
- */
-public class FileTransferHandler extends TransferHandler {
-
-    private static final FilePaster filePaster = new FilePaster();
-
-    @Override
-    public int getSourceActions(JComponent c) {
-        return COPY;
-    }
-
-    @Override
-    public boolean canImport(TransferSupport support) {
-        return filePaster.supports(support);
-    }
-
-    @Override
-    public boolean importData(TransferSupport support) {
-        try {
-            if (filePaster.supports(support)) {
-                return filePaster.importData(support, null, null);
-            }
-        } catch (UnsupportedFlavorException | IOException e) {
-            Main.warn(e, "Error while importing file.");
-        }
-        return super.importData(support);
-    }
-}
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/OpenTransferHandler.java b/src/org/openstreetmap/josm/gui/datatransfer/OpenTransferHandler.java
new file mode 100644
index 0000000..cf9a05c
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/datatransfer/OpenTransferHandler.java
@@ -0,0 +1,26 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.openstreetmap.josm.gui.datatransfer.importers.AbstractOsmDataPaster;
+import org.openstreetmap.josm.gui.datatransfer.importers.FilePaster;
+import org.openstreetmap.josm.gui.datatransfer.importers.OsmLinkPaster;
+
+/**
+ * This transfer handler allows to e.g. drop files to open them.
+ *
+ * @author Michael Zangl
+ * @since 10620
+ * @since xxx rename
+ */
+public class OpenTransferHandler extends AbstractStackTransferHandler {
+
+    private static final Collection<AbstractOsmDataPaster> SUPPORTED = Arrays.asList(new FilePaster(), new OsmLinkPaster());
+
+    @Override
+    protected Collection<AbstractOsmDataPaster> getSupportedPasters() {
+        return SUPPORTED;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandler.java b/src/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandler.java
index fdc8b89..a8f7dc8 100644
--- a/src/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandler.java
+++ b/src/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandler.java
@@ -8,13 +8,12 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
-import javax.swing.TransferHandler;
-
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.datatransfer.importers.AbstractOsmDataPaster;
 import org.openstreetmap.josm.gui.datatransfer.importers.FilePaster;
+import org.openstreetmap.josm.gui.datatransfer.importers.OsmLinkPaster;
 import org.openstreetmap.josm.gui.datatransfer.importers.PrimitiveDataPaster;
 import org.openstreetmap.josm.gui.datatransfer.importers.PrimitiveTagTransferPaster;
 import org.openstreetmap.josm.gui.datatransfer.importers.TagTransferPaster;
@@ -26,42 +25,16 @@ import org.openstreetmap.josm.gui.layer.OsmDataLayer;
  * @author Michael Zangl
  * @since 10604
  */
-public class OsmTransferHandler extends TransferHandler {
+public class OsmTransferHandler extends AbstractStackTransferHandler {
 
     private static final Collection<AbstractOsmDataPaster> SUPPORTED = Arrays.asList(
             new FilePaster(), new PrimitiveDataPaster(),
             new PrimitiveTagTransferPaster(),
-            new TagTransferPaster(), new TextTagPaster());
+            new TagTransferPaster(), new OsmLinkPaster(), new TextTagPaster());
 
     @Override
-    public boolean canImport(TransferSupport support) {
-        // import everything for now, only support copy.
-        for (AbstractOsmDataPaster df : SUPPORTED) {
-            if (df.supports(support)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public boolean importData(TransferSupport support) {
-        return importData(support, Main.getLayerManager().getEditLayer(), null);
-    }
-
-    private boolean importData(TransferSupport support, OsmDataLayer layer, EastNorth center) {
-        for (AbstractOsmDataPaster df : SUPPORTED) {
-            if (df.supports(support)) {
-                try {
-                    if (df.importData(support, layer, center)) {
-                        return true;
-                    }
-                } catch (UnsupportedFlavorException | IOException e) {
-                    Main.warn(e);
-                }
-            }
-        }
-        return super.importData(support);
+    protected Collection<AbstractOsmDataPaster> getSupportedPasters() {
+        return SUPPORTED;
     }
 
     private boolean importTags(TransferSupport support, Collection<? extends OsmPrimitive> primitives) {
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractOsmDataPaster.java b/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractOsmDataPaster.java
index f9aa4c3..619b9f9 100644
--- a/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractOsmDataPaster.java
+++ b/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractOsmDataPaster.java
@@ -56,7 +56,7 @@ public abstract class AbstractOsmDataPaster {
     /**
      * Attempts to import the given transfer data.
      * @param support The transfer support to import from.
-     * @param layer The layer to paste at.
+     * @param layer The layer to paste at. May be null.
      * @param pasteAt The position to paste at.
      * @return <code>true</code> if the import was successful.
      * @throws UnsupportedFlavorException if the requested data flavor is not supported
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPaster.java b/src/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPaster.java
new file mode 100644
index 0000000..1f990c1
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPaster.java
@@ -0,0 +1,115 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer.importers;
+
+import java.awt.Component;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.TransferHandler.TransferSupport;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Handles the paste / drop of an OSM address.
+ * <p>
+ * e.g. http://www.openstreetmap.org/node/123 downloads node 123
+ *
+ * @author Michael Zangl
+ * @since xxx
+ */
+public class OsmLinkPaster extends AbstractOsmDataPaster {
+
+    private static final BooleanProperty PASTE_REFERRERS = new BooleanProperty("paste.url.download-referrers", true);
+    private static final String OSM_SERVER = "^https?\\://(\\w+\\.)?(osm|openstreetmap)\\.org/";
+
+    /**
+     * Create a new Osm address paster
+     */
+    public OsmLinkPaster() {
+        super(DataFlavor.stringFlavor);
+    }
+
+    @Override
+    public boolean importData(TransferSupport support, OsmDataLayer layer, EastNorth pasteAt)
+            throws UnsupportedFlavorException, IOException {
+        if (!supports(support)) {
+            throw new UnsupportedFlavorException(df);
+        }
+
+        String transferData = (String) support.getTransferable().getTransferData(df);
+        List<PrimitiveId> ids = parseIds(transferData);
+
+        if (!ids.isEmpty()) {
+            Main.worker.submit(new DownloadPrimitivesWithReferrersTask(layer == null,
+                    ids, PASTE_REFERRERS.get(), PASTE_REFERRERS.get(), null, null));
+            return true;
+        }
+
+        LatLon ll = parseLatLon(transferData);
+        if (ll != null) {
+            Component comp = support.getComponent();
+            if (comp instanceof MapView) {
+                ((MapView) comp).zoomTo(ll);
+            }
+        }
+
+        return false;
+    }
+
+    protected static LatLon parseLatLon(String transferData) {
+        Matcher matcher = Pattern
+                .compile(OSM_SERVER + "#map=(?<zoom>\\d+)/(?<lat>-?\\d+\\.\\d+)/(?<lon>-?\\d+\\.\\d+)$")
+                .matcher(transferData);
+
+        if (!matcher.matches()) {
+            return null;
+        } else {
+            return new LatLon(Double.parseDouble(matcher.group("lat")), Double.parseDouble(matcher.group("lon")));
+        }
+    }
+
+    static List<PrimitiveId> parseIds(String transferData) {
+        Matcher matcher = Pattern
+                .compile(OSM_SERVER + "(?<type>node|way|relation)/(?<id>\\d+)(\\/.*)?$")
+                .matcher(transferData);
+
+        if (!matcher.matches()) {
+            return Collections.emptyList();
+        }
+
+        OsmPrimitiveType type;
+        switch (matcher.group("type")) {
+        case "way":
+            type = OsmPrimitiveType.WAY;
+            break;
+
+        case "node":
+            type = OsmPrimitiveType.NODE;
+            break;
+
+        case "relation":
+            type = OsmPrimitiveType.RELATION;
+            break;
+
+        default:
+            throw new AssertionError();
+        }
+
+        return Collections.singletonList(new SimplePrimitiveId(Long.parseLong(matcher.group("id")), type));
+    }
+
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java
new file mode 100644
index 0000000..a227b93
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java
@@ -0,0 +1,52 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer.importers;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Test {@link OsmLinkPaster}
+ * @author Michael Zangl
+ * @since xxx
+ */
+public class OsmLinkPasterTest {
+    /**
+     * No dependencies
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules();
+
+    /**
+     * Test of {@link OsmLinkPaster#parseIds(String)}
+     */
+    @Test
+    public void testParseIds() {
+        assertArrayEquals(new Object[] { new SimplePrimitiveId(1234, OsmPrimitiveType.NODE) },
+                OsmLinkPaster.parseIds("http://www.openstreetmap.org/node/1234").toArray());
+        assertArrayEquals(new Object[] { new SimplePrimitiveId(1234, OsmPrimitiveType.WAY) },
+                OsmLinkPaster.parseIds("http://www.openstreetmap.org/way/1234").toArray());
+        assertArrayEquals(new Object[] { new SimplePrimitiveId(1234, OsmPrimitiveType.RELATION) },
+                OsmLinkPaster.parseIds("http://www.openstreetmap.org/relation/1234").toArray());
+
+        assertArrayEquals(new Object[] { new SimplePrimitiveId(1234, OsmPrimitiveType.NODE) },
+                OsmLinkPaster.parseIds("http://www.osm.org/node/1234").toArray());
+        assertArrayEquals(new Object[] { new SimplePrimitiveId(1234, OsmPrimitiveType.WAY) },
+                OsmLinkPaster.parseIds("http://osm.org/way/1234").toArray());
+        assertArrayEquals(new Object[] { new SimplePrimitiveId(1234, OsmPrimitiveType.RELATION) },
+                OsmLinkPaster.parseIds("https://www.openstreetmap.org/relation/1234").toArray());
+
+
+        assertArrayEquals(new Object[0], OsmLinkPaster.parseIds("http://www.openstreetmap.org/xx/1234").toArray());
+        assertArrayEquals(new Object[0], OsmLinkPaster.parseIds("http://www.openstreetmap.org/way/1234x").toArray());
+        assertArrayEquals(new Object[0], OsmLinkPaster.parseIds("").toArray());
+    }
+
+}
