diff --git a/src/org/openstreetmap/josm/actions/CopyAction.java b/src/org/openstreetmap/josm/actions/CopyAction.java
index cc6cb5b..681c8ba 100644
--- a/src/org/openstreetmap/josm/actions/CopyAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyAction.java
@@ -5,6 +5,7 @@
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.util.Collection;
@@ -14,9 +15,10 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy;
+import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Copy OSM primitives to clipboard in order to paste them, or their tags, somewhere else.
@@ -56,11 +58,8 @@ public void actionPerformed(ActionEvent e) {
      */
     public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
         /* copy ids to the clipboard */
-        String ids = getCopyString(primitives);
-        Utils.copyToClipboard(ids);
-
-        Main.pasteBuffer.makeCopy(primitives);
-        Main.pasteSource = source;
+        final PrimitiveTransferable transferable = new PrimitiveTransferable(new PrimitiveDeepCopy(primitives).getAll(), true);
+        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
     }
 
     public static String getCopyString(Collection<? extends OsmPrimitive> primitives) {
diff --git a/src/org/openstreetmap/josm/actions/DuplicateAction.java b/src/org/openstreetmap/josm/actions/DuplicateAction.java
index 6c0d1d9..677868b 100644
--- a/src/org/openstreetmap/josm/actions/DuplicateAction.java
+++ b/src/org/openstreetmap/josm/actions/DuplicateAction.java
@@ -28,7 +28,7 @@ public DuplicateAction() {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        Main.main.menu.paste.pasteData(new PrimitiveDeepCopy(getCurrentDataSet().getSelected()), getEditLayer(), e);
+//        Main.main.menu.paste.pasteData(new PrimitiveDeepCopy(getCurrentDataSet().getSelected()), getEditLayer(), e);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/PasteAction.java b/src/org/openstreetmap/josm/actions/PasteAction.java
index 96e5873..8509eaa 100644
--- a/src/org/openstreetmap/josm/actions/PasteAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteAction.java
@@ -7,8 +7,11 @@
 
 import java.awt.MouseInfo;
 import java.awt.Point;
+import java.awt.Toolkit;
+import java.awt.datatransfer.UnsupportedFlavorException;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -26,6 +29,7 @@
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -48,24 +52,27 @@ public PasteAction() {
         Main.pasteBuffer.addPasteBufferChangedListener(this);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!isEnabled())
-            return;
-        pasteData(Main.pasteBuffer, Main.pasteSource, e);
+        try {
+            pasteData((Iterable<PrimitiveData>) Toolkit.getDefaultToolkit().getSystemClipboard().getData(PrimitiveTransferable.PRIMITIVE_DATA), Main.pasteSource, e);
+        } catch (UnsupportedFlavorException | IOException e1) {
+            e1.printStackTrace();
+        }
     }
 
     /**
      * Paste OSM primitives from the given paste buffer and OSM data layer source to the current edit layer.
-     * @param pasteBuffer The paste buffer containing primitive ids to copy
+     * @param paste The primitive ids to paste
      * @param source The OSM data layer used to look for primitive ids
      * @param e The ActionEvent that triggered this operation
      */
-    public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e) {
+    public void pasteData(Iterable<PrimitiveData> paste, Layer source, ActionEvent e) {
         /* Find the middle of the pasteBuffer area */
         double maxEast = -1E100, minEast = 1E100, maxNorth = -1E100, minNorth = 1E100;
         boolean incomplete = false;
-        for (PrimitiveData data : pasteBuffer.getAll()) {
+        for (PrimitiveData data : paste) {
             if (data instanceof NodeData) {
                 NodeData n = (NodeData) data;
                 if (n.getEastNorth() != null) {
@@ -118,7 +125,7 @@ public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e
         Map<Long, Long> newNodeIds = new HashMap<>();
         Map<Long, Long> newWayIds = new HashMap<>();
         Map<Long, Long> newRelationIds = new HashMap<>();
-        for (PrimitiveData data: pasteBuffer.getAll()) {
+        for (PrimitiveData data: paste) {
             if (data.isIncomplete()) {
                 continue;
             }
@@ -132,9 +139,9 @@ public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e
                 newRelationIds.put(data.getUniqueId(), copy.getUniqueId());
             }
             bufferCopy.add(copy);
-            if (pasteBuffer.getDirectlyAdded().contains(data)) {
-                toSelect.add(copy);
-            }
+//            if (pasteBuffer.getDirectlyAdded().contains(data)) {
+//                toSelect.add(copy);
+//            }
         }
 
         // Update references in copied buffer
@@ -196,11 +203,7 @@ protected boolean confirmDeleteIncomplete() {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null || Main.pasteBuffer == null) {
-            setEnabled(false);
-            return;
-        }
-        setEnabled(!Main.pasteBuffer.isEmpty());
+        setEnabled(Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(PrimitiveTransferable.PRIMITIVE_DATA));
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java b/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java
index c01e5c7..2f25945 100644
--- a/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java
+++ b/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java
@@ -6,6 +6,7 @@
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
@@ -22,6 +23,7 @@
      */
     public static final DataFlavor PRIMITIVE_DATA = new DataFlavor(PrimitiveData.class, PrimitiveData.class.getName());
     private final Collection<? extends OsmPrimitive> primitives;
+    private final Collection<? extends PrimitiveData> primitiveData;
 
     /**
      * Constructs a new {@code PrimitiveTransferable}.
@@ -29,6 +31,12 @@
      */
     public PrimitiveTransferable(Collection<? extends OsmPrimitive> primitives) {
         this.primitives = primitives;
+        this.primitiveData = Collections.emptyList();
+    }
+
+    public PrimitiveTransferable(Collection<? extends PrimitiveData> primitiveData, boolean marker) {
+        this.primitives = Collections.emptyList();
+        this.primitiveData = primitiveData;
     }
 
     @Override
@@ -59,14 +67,20 @@ protected String getStringData() {
             sb.append(" # ").append(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
             sb.append("\n");
         }
+        for (PrimitiveData data : primitiveData) {
+            sb.append(data.getType());
+            sb.append(" ").append(data.getUniqueId());
+            sb.append("\n");
+        }
         return sb.toString().replace("\u200E", "").replace("\u200F", "");
     }
 
     protected Collection<PrimitiveData> getRelationMemberData() {
-        final Collection<PrimitiveData> r = new ArrayList<>(primitives.size());
+        final Collection<PrimitiveData> r = new ArrayList<>(primitives.size() + primitiveData.size());
         for (OsmPrimitive primitive : primitives) {
             r.add(primitive.save());
         }
+        r.addAll(primitiveData);
         return r;
     }
 }
