Index: trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java	(revision 9562)
+++ trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java	(revision 9563)
@@ -12,11 +12,22 @@
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 
+/**
+ * Transferable objects for {@link PrimitiveData}.
+ * @since 9369
+ */
 public class PrimitiveTransferable implements Transferable {
 
+    /**
+     * Data flavor for {@link PrimitiveData}.
+     */
     public static final DataFlavor PRIMITIVE_DATA = new DataFlavor(PrimitiveData.class, PrimitiveData.class.getName());
-    private final Collection<OsmPrimitive> primitives;
+    private final Collection<? extends OsmPrimitive> primitives;
 
-    public PrimitiveTransferable(Collection<OsmPrimitive> members) {
-        this.primitives = members;
+    /**
+     * Constructs a new {@code PrimitiveTransferable}.
+     * @param primitives collection of OSM primitives
+     */
+    public PrimitiveTransferable(Collection<? extends OsmPrimitive> primitives) {
+        this.primitives = primitives;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferable.java	(revision 9562)
+++ trunk/src/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferable.java	(revision 9563)
@@ -12,9 +12,20 @@
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 
+/**
+ * Transferable objects for {@link RelationMemberData}.
+ * @since 9368
+ */
 public class RelationMemberTransferable implements Transferable {
 
+    /**
+     * Data flavor for {@link RelationMemberData}.
+     */
     public static final DataFlavor RELATION_MEMBER_DATA = new DataFlavor(RelationMemberData.class, RelationMemberData.class.getName());
     private final Collection<RelationMember> members;
 
+    /**
+     * Constructs a new {@code RelationMemberTransferable}.
+     * @param members list of relation members
+     */
     public RelationMemberTransferable(Collection<RelationMember> members) {
         this.members = members;
Index: trunk/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java	(revision 9563)
+++ trunk/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java	(revision 9563)
@@ -0,0 +1,76 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable.PRIMITIVE_DATA;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.PrimitiveData;
+
+/**
+ * Unit tests of {@link PrimitiveTransferable} class.
+ */
+public class PrimitiveTransferableTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test of {@link PrimitiveTransferable#getTransferDataFlavors()} method.
+     */
+    @Test
+    public void testGetTransferDataFlavors() {
+        DataFlavor[] flavors = new PrimitiveTransferable(null).getTransferDataFlavors();
+        assertEquals(2, flavors.length);
+        assertEquals(PRIMITIVE_DATA, flavors[0]);
+        assertEquals(DataFlavor.stringFlavor, flavors[1]);
+    }
+
+    /**
+     * Test of {@link PrimitiveTransferable#isDataFlavorSupported} method.
+     */
+    @Test
+    public void testIsDataFlavorSupported() {
+        assertTrue(new PrimitiveTransferable(null).isDataFlavorSupported(PRIMITIVE_DATA));
+        assertFalse(new PrimitiveTransferable(null).isDataFlavorSupported(null));
+    }
+
+    /**
+     * Test of {@link PrimitiveTransferable#getTransferData} method - nominal case.
+     * @throws UnsupportedFlavorException never
+     */
+    @Test
+    @SuppressWarnings("unchecked")
+    public void testGetTransferDataNominal() throws UnsupportedFlavorException {
+        PrimitiveTransferable pt = new PrimitiveTransferable(Collections.singleton(new Node(1)));
+        assertEquals("node 1 # incomplete\n", pt.getTransferData(DataFlavor.stringFlavor));
+        Collection<PrimitiveData> td = (Collection<PrimitiveData>) pt.getTransferData(PRIMITIVE_DATA);
+        assertEquals(1, td.size());
+        assertNotNull(td.iterator().next());
+    }
+
+    /**
+     * Test of {@link PrimitiveTransferable#getTransferData} method - error case.
+     * @throws UnsupportedFlavorException always
+     */
+    @Test(expected = UnsupportedFlavorException.class)
+    public void testGetTransferDataError() throws UnsupportedFlavorException {
+        new PrimitiveTransferable(Collections.singleton(new Node(1))).getTransferData(null);
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java	(revision 9563)
+++ trunk/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java	(revision 9563)
@@ -0,0 +1,77 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable.RELATION_MEMBER_DATA;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.PrimitiveData;
+import org.openstreetmap.josm.data.osm.RelationMember;
+
+/**
+ * Unit tests of {@link RelationMemberTransferable} class.
+ */
+public class RelationMemberTransferableTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test of {@link RelationMemberTransferable#getTransferDataFlavors()} method.
+     */
+    @Test
+    public void testGetTransferDataFlavors() {
+        DataFlavor[] flavors = new RelationMemberTransferable(null).getTransferDataFlavors();
+        assertEquals(2, flavors.length);
+        assertEquals(RELATION_MEMBER_DATA, flavors[0]);
+        assertEquals(DataFlavor.stringFlavor, flavors[1]);
+    }
+
+    /**
+     * Test of {@link RelationMemberTransferable#isDataFlavorSupported} method.
+     */
+    @Test
+    public void testIsDataFlavorSupported() {
+        assertTrue(new RelationMemberTransferable(null).isDataFlavorSupported(RELATION_MEMBER_DATA));
+        assertFalse(new RelationMemberTransferable(null).isDataFlavorSupported(null));
+    }
+
+    /**
+     * Test of {@link RelationMemberTransferable#getTransferData} method - nominal case.
+     * @throws UnsupportedFlavorException never
+     */
+    @Test
+    @SuppressWarnings("unchecked")
+    public void testGetTransferDataNominal() throws UnsupportedFlavorException {
+        RelationMemberTransferable rmt = new RelationMemberTransferable(Collections.singleton(new RelationMember("test", new Node(1))));
+        assertEquals("node 1 test # incomplete\n", rmt.getTransferData(DataFlavor.stringFlavor));
+        Collection<PrimitiveData> td = (Collection<PrimitiveData>) rmt.getTransferData(RELATION_MEMBER_DATA);
+        assertEquals(1, td.size());
+        assertNotNull(td.iterator().next());
+    }
+
+    /**
+     * Test of {@link RelationMemberTransferable#getTransferData} method - error case.
+     * @throws UnsupportedFlavorException always
+     */
+    @Test(expected = UnsupportedFlavorException.class)
+    public void testGetTransferDataError() throws UnsupportedFlavorException {
+        new RelationMemberTransferable(Collections.singleton(new RelationMember(null, new Node(1)))).getTransferData(null);
+    }
+}
