diff --git a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/all/UITestsSuite.java b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/all/UITestsSuite.java
index a91c1a0..c41dd54 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/all/UITestsSuite.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/all/UITestsSuite.java
@@ -59,6 +59,7 @@
 import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.StructureNodeDetailsPageTest;
 import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.TestElementNodeDetailsPage;
 import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.TestTypeNullNameAttribute;
+import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.clipboard.ClipboardServiceTest;
 import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.dnd.SiEditorTransferTest;
 import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.dnd.TreeViewerDropAdapterTest;
 import org.eclipse.wst.sse.sieditor.test.ui.v2.dt.extract.ExtractNamespaceWizardTest;
@@ -284,6 +285,7 @@
     PageChangedListenersManagerTest.class,
     SiEditorTransferTest.class,
     TreeViewerDropAdapterTest.class,
+    ClipboardServiceTest.class,
 })
 public class UITestsSuite {
 
diff --git a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/clipboard/ClipboardServiceTest.java b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/clipboard/ClipboardServiceTest.java
new file mode 100644
index 0000000..c212576
--- /dev/null
+++ b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/clipboard/ClipboardServiceTest.java
@@ -0,0 +1,122 @@
+package org.eclipse.wst.sse.sieditor.test.ui.v2.dt.clipboard;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
+import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
+import org.eclipse.wst.sse.sieditor.model.impl.WSDLFactory;
+import org.eclipse.wst.sse.sieditor.model.impl.XSDFactory;
+import org.eclipse.wst.sse.sieditor.model.wsdl.api.IDescription;
+import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
+import org.eclipse.wst.sse.sieditor.model.xsd.api.IType;
+import org.eclipse.wst.sse.sieditor.test.util.ProjectBasedTest;
+import org.eclipse.wst.sse.sieditor.test.util.ResourceUtils;
+import org.eclipse.wst.sse.sieditor.test.util.SIEditorBaseTest;
+import org.eclipse.wst.sse.sieditor.ui.v2.dt.clipboard.ClipboardService;
+import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IDataTypesTreeNode;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.wst.wsdl.util.WSDLResourceImpl;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDResourceImpl;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+@SuppressWarnings("nls")
+public class ClipboardServiceTest extends ProjectBasedTest {
+
+    private static final String NEW_OPERATION = "NewOperation";
+    private static final String ELEMENT1 = "Element1";
+    private IFile xsdFile;
+    private IFile wsdlFile;
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+
+        xsdFile = ResourceUtils.copyFileIntoTestProject("pub/extract/NewXMLSchema1.xsd", SIEditorBaseTest.Document_FOLDER_NAME,
+                this.getProject(), "NewXMLSchema1.xsd");
+        wsdlFile = ResourceUtils.copyFileIntoTestProject("pub/simple/NewWSDLFileCyclingTypes.wsdl",
+                SIEditorBaseTest.Document_FOLDER_NAME, this.getProject(), "ECC_CUSTOMER002QR.wsdl");
+
+        setDeleteProjectOnTearDown();
+    }
+
+    @Test
+    public void testIsCopyEnabled() {
+        Assert.assertFalse(ClipboardService.isCopyEnabled(null));
+        Assert.assertFalse(ClipboardService.isCopyEnabled(new Object[0]));
+
+        Object[] selection = { new Object(), new Object() };
+        Assert.assertFalse(ClipboardService.isCopyEnabled(selection));
+
+        IDataTypesTreeNode dataTypesTreeNode = Mockito.mock(IDataTypesTreeNode.class);
+        selection[0] = dataTypesTreeNode;
+        selection[1] = new Object();
+
+        Mockito.when(dataTypesTreeNode.getModelObject()).thenReturn(Mockito.mock(IDescription.class));
+        Assert.assertFalse(ClipboardService.isCopyEnabled(selection));
+
+        Mockito.when(dataTypesTreeNode.getModelObject()).thenReturn(Mockito.mock(IType.class));
+        Assert.assertFalse(ClipboardService.isCopyEnabled(selection));
+
+        selection = new IDataTypesTreeNode[1];
+        selection[0] = dataTypesTreeNode;
+        Mockito.when(dataTypesTreeNode.getModelObject()).thenReturn(Mockito.mock(IType.class));
+        Assert.assertTrue(ClipboardService.isCopyEnabled(selection));
+    }
+
+    @Test
+    public void testCopyModelObject() {
+        ResourceSet resourceSet = new ResourceSetImpl();
+
+        XSDResourceImpl xsdResource = (XSDResourceImpl) resourceSet.getResource(createFileUri(xsdFile), true);
+        XSDSchema schema = xsdResource.getSchema();
+        IXSDModelRoot xsdModelRoot = XSDFactory.getInstance().createXSDModelRoot(schema);
+
+        IType typeFromSchema = xsdModelRoot.getSchema().getType(true, ELEMENT1);
+
+        WSDLResourceImpl resource = (WSDLResourceImpl) resourceSet.getResource(createFileUri(wsdlFile), true);
+        Definition definition = resource.getDefinition();
+
+        IWsdlModelRoot wsdlModelRoot = WSDLFactory.getInstance().createWSDLModelRoot(definition);
+        ISchema schemaFromWsdl = wsdlModelRoot.getDescription().getSchema("http://www.example.org/NewWSDLFile1/")[0];
+        IType elementFromWsdl = schemaFromWsdl.getType(true, NEW_OPERATION);
+
+        Object[] selection = new Object[3];
+        selection[0] = new Object();
+        IDataTypesTreeNode dataTypesTreeNode = Mockito.mock(IDataTypesTreeNode.class);
+        Mockito.when(dataTypesTreeNode.getModelObject()).thenReturn(typeFromSchema);
+        IDataTypesTreeNode dataTypesTreeNode2 = Mockito.mock(IDataTypesTreeNode.class);
+        Mockito.when(dataTypesTreeNode2.getModelObject()).thenReturn(elementFromWsdl);
+        selection[1] = dataTypesTreeNode;
+        selection[2] = dataTypesTreeNode2;
+
+        ClipboardService.copyModelObjectsToClipboard(selection);
+        Object[] modelObjectsFromClipboard = ClipboardService.getModelObjectsFromClipboard();
+        Assert.assertEquals(modelObjectsFromClipboard.length, 2);
+        Assert.assertSame(modelObjectsFromClipboard[0], typeFromSchema);
+        Assert.assertSame(modelObjectsFromClipboard[1], elementFromWsdl);
+
+        Clipboard clipboard = new Clipboard(Display.getCurrent());
+        String modelObjectAsText = (String) clipboard.getContents(TextTransfer.getInstance());
+        assertTrue(modelObjectAsText.contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));
+        assertTrue(modelObjectAsText.contains(ELEMENT1));
+        assertTrue(modelObjectAsText.contains(NEW_OPERATION));
+    }
+
+    @Override
+    protected String getProjectName() {
+        return "ClibboardServiceTest";
+    }
+
+    protected URI createFileUri(IFile file) {
+        return URI.createFileURI(file.getLocation().toFile().getAbsolutePath());
+    }
+}
