Index: trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 9993)
+++ trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 9994)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.data.osm;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -73,3 +76,24 @@
     @Override
     public abstract OsmPrimitiveType getType();
+
+    private void writeObject(ObjectOutputStream oos) throws IOException {
+        // since super class is not Serializable
+        oos.writeLong(id);
+        oos.writeLong(user == null ? -1 : user.getId());
+        oos.writeInt(version);
+        oos.writeInt(changesetId);
+        oos.writeInt(timestamp);
+        oos.defaultWriteObject();
+    }
+
+    private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
+        // since super class is not Serializable
+        id = ois.readLong();
+        final long userId = ois.readLong();
+        user = userId == -1 ? null : User.getById(userId);
+        version = ois.readInt();
+        changesetId = ois.readInt();
+        timestamp = ois.readInt();
+        ois.defaultReadObject();
+    }
 }
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/NodeDataTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/NodeDataTest.java	(revision 9994)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/NodeDataTest.java	(revision 9994)
@@ -0,0 +1,31 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+public class NodeDataTest {
+    @Test
+    public void testSerializationForDragAndDrop() throws Exception {
+        final NodeData data = new NodeData();
+        data.setCoor(new LatLon(31.14, 15.9));
+        data.setId(314);
+        data.setVersion(14);
+        data.setChangesetId(314159);
+        final Object readData;
+        try (final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+             final ObjectOutputStream out = new ObjectOutputStream(bytes)) {
+            out.writeObject(data);
+            try (final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
+                readData = in.readObject();
+            }
+        }
+        Assert.assertEquals(data.toString(), readData.toString());
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/WayDataTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/WayDataTest.java	(revision 9994)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/WayDataTest.java	(revision 9994)
@@ -0,0 +1,31 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class WayDataTest {
+    @Test
+    public void testSerializationForDragAndDrop() throws Exception {
+        final WayData data = new WayData();
+        data.setNodes(Arrays.asList(1415L, 9265L, 3589L, 7932L, 3846L));
+        data.setId(314);
+        data.setVersion(14);
+        data.setChangesetId(314159);
+        final Object readData;
+        try (final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+             final ObjectOutputStream out = new ObjectOutputStream(bytes)) {
+            out.writeObject(data);
+            try (final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
+                readData = in.readObject();
+            }
+        }
+        Assert.assertEquals(data.toString(), readData.toString());
+    }
+}
