diff --git a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/wsdl/MakeResolvableCommand.java b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/wsdl/MakeResolvableCommand.java
index 38b6c5c..e9225ad 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/wsdl/MakeResolvableCommand.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/wsdl/MakeResolvableCommand.java
@@ -19,9 +19,6 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.xsd.XSDElementDeclaration;
-import org.eclipse.xsd.XSDNamedComponent;
-
 import org.eclipse.wst.sse.sieditor.command.common.AbstractWSDLNotificationOperation;
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.CopyTypeCommand;
 import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
@@ -34,6 +31,8 @@
 import org.eclipse.wst.sse.sieditor.model.xsd.api.IType;
 import org.eclipse.wst.sse.sieditor.model.xsd.impl.Schema;
 import org.eclipse.wst.sse.sieditor.model.xsd.impl.UnresolvedType;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
 
 public class MakeResolvableCommand extends AbstractWSDLNotificationOperation {
 
@@ -73,8 +72,7 @@
             if (null != oldType) {
                 resolvedType = oldType;
             } else {
-                final CopyTypeCommand command = new CopyTypeCommand(getModelRoot(), description, eType, schema, type
-                        .getName());
+                final CopyTypeCommand command = new CopyTypeCommand(getModelRoot(), description, eType, schema);
                 IStatus status = getModelRoot().getEnv().execute(command);
                 if (!StatusUtils.canContinue(status)) {
                     return status;
diff --git a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyElementCommand.java b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyElementCommand.java
index 1449634..68d009c 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyElementCommand.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyElementCommand.java
@@ -22,6 +22,19 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.wst.sse.sieditor.command.common.AbstractXSDNotificationOperation;
+import org.eclipse.wst.sse.sieditor.model.Activator;
+import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
+import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
+import org.eclipse.wst.sse.sieditor.model.i18n.Messages;
+import org.eclipse.wst.sse.sieditor.model.impl.XSDFactory;
+import org.eclipse.wst.sse.sieditor.model.utils.StatusUtils;
+import org.eclipse.wst.sse.sieditor.model.xsd.api.IElement;
+import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
+import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType;
+import org.eclipse.wst.sse.sieditor.model.xsd.impl.Element;
+import org.eclipse.wst.sse.sieditor.model.xsd.impl.Schema;
+import org.eclipse.wst.sse.sieditor.model.xsd.impl.StructureType;
 import org.eclipse.xsd.XSDAttributeDeclaration;
 import org.eclipse.xsd.XSDAttributeUse;
 import org.eclipse.xsd.XSDComplexTypeContent;
@@ -36,21 +49,6 @@
 import org.eclipse.xsd.XSDSimpleTypeDefinition;
 import org.eclipse.xsd.XSDTypeDefinition;
 
-import org.eclipse.wst.sse.sieditor.command.common.AbstractXSDNotificationOperation;
-import org.eclipse.wst.sse.sieditor.model.Activator;
-import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
-import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
-import org.eclipse.wst.sse.sieditor.model.i18n.Messages;
-import org.eclipse.wst.sse.sieditor.model.impl.XSDFactory;
-import org.eclipse.wst.sse.sieditor.model.utils.StatusUtils;
-import org.eclipse.wst.sse.sieditor.model.xsd.api.IElement;
-import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
-import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType;
-import org.eclipse.wst.sse.sieditor.model.xsd.impl.AbstractXSDComponent;
-import org.eclipse.wst.sse.sieditor.model.xsd.impl.Element;
-import org.eclipse.wst.sse.sieditor.model.xsd.impl.Schema;
-import org.eclipse.wst.sse.sieditor.model.xsd.impl.StructureType;
-
 /**
  * Command for copying a local ElementDeclaration or an AttributeDeclaration
  * 
@@ -85,8 +83,8 @@
 
                 final EnsureElementAnonymousTypeCommand command = new EnsureElementAnonymousTypeCommand(getModelRoot(), element);
                 IStatus status = getModelRoot().getEnv().execute(command);
-                if(!StatusUtils.canContinue(status)) {
-                	return status;
+                if (!StatusUtils.canContinue(status)) {
+                    return status;
                 }
                 type = command.getAnonymousType();
             } else {
@@ -142,15 +140,15 @@
 
         IXSDModelRoot xsdModelRoot = XSDFactory.getInstance().createXSDModelRoot(type.getSchema());
         _copiedElement = new Element(xsdModelRoot, copiedComponent, modelGroup, structureType, schema);
-		
-		IModelObject modelObject = ((IXSDModelRoot) getModelRoot()).getSchema();
-	    
+
+        IModelObject modelObject = ((IXSDModelRoot) getModelRoot()).getSchema();
+
         final CopyTypeCommand command = new CopyTypeCommand(getModelRoot(), modelObject,
                 (XSDNamedComponent) (component instanceof XSDParticle ? ((XSDParticle) component).getContent() : component),
-                _targetSchema, _element.getName());
+                _targetSchema);
         command.updateReferences(namedComponent);
         IStatus status = getModelRoot().getEnv().execute(command);
-		if (!StatusUtils.canContinue(status)) {
+        if (!StatusUtils.canContinue(status)) {
             return status;
         }
 
diff --git a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyTypeCommand.java b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyTypeCommand.java
index bee314c..14c785e 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyTypeCommand.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/command/emf/xsd/CopyTypeCommand.java
@@ -17,13 +17,14 @@
 
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.runtime.Assert;
@@ -38,7 +39,6 @@
 import org.eclipse.wst.sse.sieditor.core.common.CollectionTypeUtils;
 import org.eclipse.wst.sse.sieditor.core.common.Condition;
 import org.eclipse.wst.sse.sieditor.core.common.Logger;
-import org.eclipse.wst.sse.sieditor.model.Activator;
 import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
 import org.eclipse.wst.sse.sieditor.model.api.IModelRoot;
 import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
@@ -60,6 +60,7 @@
 import org.eclipse.xsd.XSDAttributeUse;
 import org.eclipse.xsd.XSDComplexTypeContent;
 import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
 import org.eclipse.xsd.XSDElementDeclaration;
 import org.eclipse.xsd.XSDFactory;
 import org.eclipse.xsd.XSDForm;
@@ -79,33 +80,38 @@
 
 public class CopyTypeCommand extends AbstractNotificationOperation {
 
-    private final XSDNamedComponent sourceType;
+    private XSDNamedComponent typeForCopyThatIsUnderAnalysis;
     private AbstractType clone;
     private final IModelObject parent;
     private Map<String, XSDSchema> schemasUsed;
     private final ISchema targetSchema;
-    private final String name;
+    private List<XSDNamedComponent> objectsToBeCopied;
+    private Set<XSDConcreteComponent> copiedComponents;
 
     // List of all the components copied to targetschema
     private final HashSet<XSDNamedComponent> inconsistentClones = new HashSet<XSDNamedComponent>();
     private XSDNamedComponent clonedComponent;
 
-    private IStatus executionStatus;
-
     private static final String XMLNS_PREFIX_BASE = "imp"; //$NON-NLS-1$
 
-    public CopyTypeCommand(final IModelRoot root, final IModelObject modelObject, final XSDNamedComponent typeToBeCopied,
-            final ISchema targetSchema, final String name) {
+    public CopyTypeCommand(final IModelRoot root, final IModelObject modelObject, final List<XSDNamedComponent> typesToBeCopied,
+            final ISchema targetSchema) {
         super(root, modelObject, Messages.CopyTypeCommand_copy_type_comand_label);
-        this.sourceType = typeToBeCopied;
         this.parent = modelObject;
         this.targetSchema = targetSchema;
-        this.name = name;
+        this.objectsToBeCopied = typesToBeCopied;
+        this.copiedComponents = new HashSet<XSDConcreteComponent>();
+    }
+
+    public CopyTypeCommand(final IModelRoot root, final IModelObject modelObject, final XSDNamedComponent typeToBeCopied,
+            final ISchema targetSchema) {
+        this(root, modelObject, Arrays.asList(new XSDNamedComponent[] { typeToBeCopied }), targetSchema);
     }
 
     @Override
     public boolean canExecute() {
-        return null != getModelRoot() && null != parent && null != sourceType && sourceType.eResource() != null;
+        return null != getModelRoot() && null != parent && !objectsToBeCopied.isEmpty()
+                && objectsToBeCopied.get(0).eResource() != null;
     }
 
     @SuppressWarnings("unchecked")
@@ -140,63 +146,57 @@
         if (debug)
             Logger.getDebugTrace().traceEntry(""); //$NON-NLS-1$
 
-        executionStatus = Status.OK_STATUS;
         schemasUsed = new HashMap<String, XSDSchema>();
-        final XSDNamedComponent component = sourceType;
-        final boolean isGlobal = isGlobal(component);
+        for (XSDNamedComponent component : objectsToBeCopied) {
+            this.typeForCopyThatIsUnderAnalysis = component;
+            final boolean isGlobal = isGlobal(component);
 
-        final XSDSchema schema = isGlobal ? null : targetSchema.getComponent();
+            final XSDSchema schema = isGlobal ? null : targetSchema.getComponent();
 
-        // source in visit methods can be null only when call is from this
-        // method
-        if (component instanceof XSDElementDeclaration) {
+            // source in visit methods can be null only when call is from this
+            // method
+            String componenetName = component.getName();
+            if (component instanceof XSDElementDeclaration) {
+                if (debug)
+                    Logger.getDebugTrace().trace("", "Begin copy Element " + componenetName); //$NON-NLS-1$ //$NON-NLS-2$
+                visitElementDeclaration((XSDElementDeclaration) component, schema);
+                if (debug)
+                    Logger.getDebugTrace().trace("", "End copy Element " + componenetName); //$NON-NLS-1$ //$NON-NLS-2$
+            } else if (component instanceof XSDTypeDefinition) {
+                if (debug)
+                    Logger.getDebugTrace().trace("", "Begin copy Type " + componenetName); //$NON-NLS-1$ //$NON-NLS-2$
+                visitTypeDefinition((XSDTypeDefinition) component, schema);
+                if (debug)
+                    Logger.getDebugTrace().trace("", "End copy Type " + componenetName); //$NON-NLS-1$ //$NON-NLS-2$
+            } else if (component instanceof XSDAttributeDeclaration) {
+                if (debug)
+                    Logger.getDebugTrace().trace("", "Begin copy Attribute " + componenetName); //$NON-NLS-1$ //$NON-NLS-2$
+                visitAttributeDeclaration((XSDAttributeDeclaration) component, schema);
+                if (debug)
+                    Logger.getDebugTrace().trace("", "End copy Attribute " + componenetName); //$NON-NLS-1$ //$NON-NLS-2$
+            }
+
+            // update all the references to the target schema components
             if (debug)
-                Logger.getDebugTrace().trace("", "Begin copy Element " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-            visitElementDeclaration((XSDElementDeclaration) component, schema);
+                Logger.getDebugTrace().trace("", "Update references"); //$NON-NLS-1$ //$NON-NLS-2$
+            updateComponents();
+
             if (debug)
-                Logger.getDebugTrace().trace("", "End copy Element " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-        } else if (component instanceof XSDTypeDefinition) {
-            if (debug)
-                Logger.getDebugTrace().trace("", "Begin copy Type " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-            visitTypeDefinition((XSDTypeDefinition) component, schema);
-            if (debug)
-                Logger.getDebugTrace().trace("", "End copy Type " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-        } else if (component instanceof XSDAttributeDeclaration) {
-            if (debug)
-                Logger.getDebugTrace().trace("", "Begin copy Attribute " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-            visitAttributeDeclaration((XSDAttributeDeclaration) component, schema);
-            if (debug)
-                Logger.getDebugTrace().trace("", "End copy Attribute " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+                Logger.getDebugTrace().trace("", "Refresh Schemas"); //$NON-NLS-1$ //$NON-NLS-2$
+            if (getModelRoot() instanceof IWsdlModelRoot) {
+                final Description description = (Description) ((IWsdlModelRoot) getModelRoot()).getDescription();
+                description.refreshSchemas();
+            }
+
+            if (isGlobal && clonedComponent != null) {
+                if (debug)
+                    Logger.getDebugTrace().trace("", "Get the copied Type"); //$NON-NLS-1$ //$NON-NLS-2$
+                clone = (AbstractType) targetSchema.getType(clonedComponent instanceof XSDElementDeclaration,
+                        clonedComponent.getName());
+            }
         }
 
-        // update all the references to the target schema components
-        if (debug)
-            Logger.getDebugTrace().trace("", "Update references"); //$NON-NLS-1$ //$NON-NLS-2$
-        updateComponents();
-
-        if (debug)
-            Logger.getDebugTrace().trace("", "Refresh Schemas"); //$NON-NLS-1$ //$NON-NLS-2$
-        if (getModelRoot() instanceof IWsdlModelRoot) {
-            final Description description = (Description) ((IWsdlModelRoot) getModelRoot()).getDescription();
-            description.refreshSchemas();
-        }
-
-        if (isGlobal && clonedComponent != null) {
-            if (debug)
-                Logger.getDebugTrace().trace("", "Get the copied Type"); //$NON-NLS-1$ //$NON-NLS-2$
-            clone = (AbstractType) targetSchema.getType(clonedComponent instanceof XSDElementDeclaration,
-                    clonedComponent.getName());
-        }
-
-        if (debug)
-            Logger.getDebugTrace().traceExit(""); //$NON-NLS-1$
-
-        if (executionStatus.isOK() && null == clone && isGlobal) {
-            executionStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, MessageFormat.format(
-                    Messages.CopyTypeCommand_msg_can_not_copy_type_X, sourceType.getName()));
-        }
-
-        return executionStatus;
+        return Status.OK_STATUS;
     }
 
     private boolean isGlobal(final XSDNamedComponent component) {
@@ -520,6 +520,7 @@
             // check if element already exists
             final boolean copyToTarget = isTargetSchemaComponent(simpleType);
             final XSDSimpleTypeDefinition match = contains(simpleType, XSDSimpleTypeDefinition.class, copyToTarget);
+
             if (null != match) {
                 // return if source is null
                 if (!(null == source || (copyToTarget && source.equals(targetSchema.getComponent())))) {
@@ -683,8 +684,10 @@
      * @return
      */
     private XSDSchema createClone(final XSDNamedComponent component, final boolean copyToTarget) {
-        final XSDSchema schema;
-        schema = copyToTarget ? targetSchema.getComponent() : ensureSchema(component.getTargetNamespace());
+        final XSDSchema schema = copyToTarget ? targetSchema.getComponent() : ensureSchema(component.getTargetNamespace());
+        if (copiedComponents.contains(component)) {
+            return schema;
+        }
 
         final XSDNamedComponent clone = EmfXsdUtils.cloneWithAnnotation(component, schema);
 
@@ -694,12 +697,13 @@
             inconsistentClones.add(clone);
 
         // Set new name to the cloned component if its a source component
-        if (copyToTarget && component == sourceType) {
+        if (copyToTarget && component == objectsToBeCopied.get(0)) {
             Assert.isTrue(null == clonedComponent);
             clonedComponent = clone;
-            (clone).setName(name);
         }
         _recentClone = clone;
+        copiedComponents.add(component);
+
         return schema;
     }
 
@@ -738,13 +742,6 @@
     private <T extends XSDNamedComponent> T contains(final XSDSchema schema, final XSDNamedComponent component,
             final Collection<String> locations, final Class<T> metaClass, final boolean copyToTarget) {
         String name = component.getName();
-        // After copy the component name will be @field(_name) and not the old
-        // name
-        // handle this special case case.
-        if (copyToTarget && (null != sourceType.getName() && sourceType.getName().equals(name))
-                && metaClass.isInstance(sourceType)) {
-            name = name;
-        }
 
         final EList<XSDSchemaContent> contents = schema.getContents();
         final ArrayList<XSDInclude> includes = new ArrayList<XSDInclude>();
@@ -924,7 +921,7 @@
         boolean copy = true;
         final XSDSchema schema = component.getSchema();
         Assert.isTrue(null != schema, "Components schema is null"); //$NON-NLS-1$
-        final XSDSchema sourceSchema = sourceType.getSchema();
+        final XSDSchema sourceSchema = typeForCopyThatIsUnderAnalysis.getSchema();
         Assert.isTrue(null != schema, "Source schema is null"); //$NON-NLS-1$
         copy = schema.getSchemaLocation().equals(sourceSchema.getSchemaLocation());
         copy &= (null == component.getTargetNamespace() && null == sourceSchema.getTargetNamespace())
@@ -1114,7 +1111,7 @@
             return null;
         final String name = component.getName();
         final String namespace = component.getTargetNamespace();
-        if (null != namespace && namespace.equals(sourceType.getSchema().getTargetNamespace())) {
+        if (null != namespace && namespace.equals(typeForCopyThatIsUnderAnalysis.getSchema().getTargetNamespace())) {
             final XSDSchema schema = targetSchema.getComponent();
             for (final XSDSchemaContent content : schema.getContents()) {
                 if (componentType.isInstance(content) && name.equals(((XSDNamedComponent) content).getName())) {
diff --git a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/write/xsd/api/ISchema.java b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/write/xsd/api/ISchema.java
index 5c2a3f6..bb0ed63 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/write/xsd/api/ISchema.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/write/xsd/api/ISchema.java
@@ -16,7 +16,6 @@
 package org.eclipse.wst.sse.sieditor.model.write.xsd.api;
 
 import org.eclipse.core.commands.ExecutionException;
-
 import org.eclipse.wst.sse.sieditor.model.generic.DuplicateException;
 import org.eclipse.wst.sse.sieditor.model.generic.IllegalInputException;
 import org.eclipse.wst.sse.sieditor.model.write.api.INamespacedObject;
@@ -32,12 +31,11 @@
 
     ISimpleType addSimpleType(String name) throws DuplicateException, IllegalInputException, ExecutionException;
 
-    IStructureType addStructureType(String name, boolean element) throws DuplicateException, IllegalInputException, ExecutionException;
+    IStructureType addStructureType(String name, boolean element) throws DuplicateException, IllegalInputException,
+            ExecutionException;
 
     void removeType(IType type) throws ExecutionException;
 
-    IType copyType(IType type, String newName) throws DuplicateException, ExecutionException;
-
     IType createGlobalTypeFromAnonymous(org.eclipse.wst.sse.sieditor.model.xsd.api.IElement element, String newName)
             throws DuplicateException, ExecutionException;
 
diff --git a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/wsdl/impl/Description.java b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/wsdl/impl/Description.java
index c9d8f3c..a1a4f24 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/wsdl/impl/Description.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/wsdl/impl/Description.java
@@ -364,7 +364,7 @@
                 if (null != oldType)
                     return oldType;
 
-                final CopyTypeCommand command = new CopyTypeCommand(getModelRoot(), this, eType, schema, type.getName());
+                final CopyTypeCommand command = new CopyTypeCommand(getModelRoot(), this, eType, schema);
                 getModelRoot().getEnv().execute(command);
 
                 return command.getCopiedType();
diff --git a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/xsd/impl/Schema.java b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/xsd/impl/Schema.java
index 120e701..11a2864 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/xsd/impl/Schema.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.model/api/org/eclipse/wst/sse/sieditor/model/xsd/impl/Schema.java
@@ -31,25 +31,8 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.wsdl.Definition;
-import org.eclipse.xsd.XSDComplexTypeDefinition;
-import org.eclipse.xsd.XSDElementDeclaration;
-import org.eclipse.xsd.XSDImport;
-import org.eclipse.xsd.XSDInclude;
-import org.eclipse.xsd.XSDNamedComponent;
-import org.eclipse.xsd.XSDRedefine;
-import org.eclipse.xsd.XSDSchema;
-import org.eclipse.xsd.XSDSchemaContent;
-import org.eclipse.xsd.XSDSchemaDirective;
-import org.eclipse.xsd.XSDSimpleTypeDefinition;
-import org.eclipse.xsd.XSDTypeDefinition;
-import org.eclipse.xsd.impl.XSDImportImpl;
-import org.eclipse.xsd.util.XSDConstants;
-import org.w3c.dom.Element;
-
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.AddSimpleTypeCommand;
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.AddStructureTypeCommand;
-import org.eclipse.wst.sse.sieditor.command.emf.xsd.CopyTypeCommand;
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.CreateGlobalTypeFromAnonymousCommand;
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.ImportSchemaCommand;
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.RemoveTypeCommand;
@@ -78,6 +61,21 @@
 import org.eclipse.wst.sse.sieditor.model.xsd.api.ISimpleType;
 import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType;
 import org.eclipse.wst.sse.sieditor.model.xsd.api.IType;
+import org.eclipse.wst.wsdl.Definition;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaContent;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.impl.XSDImportImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
 
 /**
  * Wrapper for {@link XSDSchema} for providing simplified API
@@ -316,8 +314,8 @@
             for (final XSDSchemaDirective importObj : imports) {
                 if (importObj instanceof XSDImport) {
                     if (null != _resolver) {
-                        schemas.addAll(_resolver.resolveSchema(((XSDImport) importObj).getNamespace(), importObj
-                                .getSchemaLocation()));
+                        schemas.addAll(_resolver.resolveSchema(((XSDImport) importObj).getNamespace(),
+                                importObj.getSchemaLocation()));
                     }
                 }
             }
@@ -406,26 +404,6 @@
         return addStructureType(name, element, null);
     }
 
-    public IType copyType(final IType type, final String newName) throws DuplicateException, ExecutionException {
-        Nil.checkNil(newName, "newName"); //$NON-NLS-1$
-        Nil.checkNil(type, "type"); //$NON-NLS-1$
-
-        if (type instanceof AbstractType && null != type.getName()) {
-            final XSDNamedComponent component = type.getComponent();
-
-            final IType[] resolvedTypes = getAllTypes(newName);
-            if (resolvedTypes != null) {
-                throw new DuplicateException("Type with name '" + newName + "' already exists"); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-
-            final CopyTypeCommand command = new CopyTypeCommand(getModelRoot(), this, component, this, newName);
-            getModelRoot().getEnv().execute(command);
-            return command.getCopiedType();
-        }
-
-        return null;
-    }
-
     public static IType getDefaultSimpleType() {
         return Schema.getSchemaForSchema().getType(false, DEFAULT_SIMPLE_BASETYPE);
     }
diff --git a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/commands/xsd/CopyTypeCommandTest.java b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/commands/xsd/CopyTypeCommandTest.java
index f1841f2..148980a 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/commands/xsd/CopyTypeCommandTest.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/commands/xsd/CopyTypeCommandTest.java
@@ -15,7 +15,6 @@
 package org.eclipse.wst.sse.sieditor.test.model.commands.xsd;
 
 import org.eclipse.core.runtime.IStatus;
-
 import org.eclipse.wst.sse.sieditor.command.common.AbstractNotificationOperation;
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.CopyTypeCommand;
 import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
@@ -24,7 +23,9 @@
 import org.eclipse.wst.sse.sieditor.model.xsd.impl.Schema;
 import org.eclipse.wst.sse.sieditor.test.model.commands.AbstractCommandTest;
 
+@SuppressWarnings("nls")
 public class CopyTypeCommandTest extends AbstractCommandTest {
+
     @Override
     protected String getWsdlFilename() {
         return "ECC_IMAPPROPRIATIONREQREJRC.wsdl";
@@ -44,12 +45,12 @@
 
     @Override
     protected void assertPostRedoState(final IStatus redoStatus, final IWsdlModelRoot modelRoot) {
-        assertTrue(targetSchema.getType(false, "MyTypeCopy") instanceof IStructureType);
+        assertTrue(targetSchema.getType(false, "AppropriationRequestID") instanceof IStructureType);
     }
 
     @Override
     protected void assertPostUndoState(final IStatus undoStatus, final IWsdlModelRoot modelRoot) {
-        assertNull(targetSchema.getType(false, "MyTypeCopy"));
+        assertNull(targetSchema.getType(false, "AppropriationRequestID"));
     }
 
     @Override
@@ -60,10 +61,9 @@
 
         schemas = modelRoot.getDescription().getSchema(TARGET_TARGET_NAMESPACE);
         targetSchema = (Schema) schemas[0];
-        
+
         assertNull(targetSchema.getType(false, "MyTypeCopy"));
 
-        return new CopyTypeCommand(targetSchema.getModelRoot(), targetSchema, typeToCopy.getComponent(), targetSchema,
-                "MyTypeCopy");
+        return new CopyTypeCommand(targetSchema.getModelRoot(), targetSchema, typeToCopy.getComponent(), targetSchema);
     }
 }
diff --git a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/xsd/XSDModelRootTest.java b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/xsd/XSDModelRootTest.java
index d44c082..1e452de 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/xsd/XSDModelRootTest.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/model/xsd/XSDModelRootTest.java
@@ -25,12 +25,6 @@
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.xsd.XSDNamedComponent;
-import org.eclipse.xsd.XSDSchema;
-import org.eclipse.xsd.XSDTypeDefinition;
-import org.junit.Assert;
-import org.junit.Test;
-
 import org.eclipse.wst.sse.sieditor.command.emf.xsd.CopyTypeCommand;
 import org.eclipse.wst.sse.sieditor.model.api.IChangeListener;
 import org.eclipse.wst.sse.sieditor.model.api.IModelChangeEvent;
@@ -44,6 +38,11 @@
 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.model.xsd.impl.Schema;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.junit.Assert;
+import org.junit.Test;
 
 public class XSDModelRootTest extends XSDBaseProjectTest {
 
@@ -66,26 +65,13 @@
         XSDNamedComponent typeToBeCopied = typeDefinitions.get(0);
         int typesNumber = schema.getAllContainedTypes().size();
 
-        CopyTypeCommand copyCommand = new CopyTypeCommand(xsdModelRoot, schema, typeToBeCopied, (Schema) schema, "HelloName");
+        CopyTypeCommand copyCommand = new CopyTypeCommand(xsdModelRoot, schema, typeToBeCopied, (Schema) schema);
         xsdModelRoot.getEnv().execute(copyCommand);
 
         assertEquals(typesNumber + 1, schema.getAllContainedTypes().size());
     }
 
     @Test
-    public void testSchemaCopyTypeCommand() throws IOException, CoreException, ExecutionException, DuplicateException {
-        IXSDModelRoot xsdModelRoot = getXSDModelRoot("pub/xsd/example.xsd", "example.xsd");
-        ISchema schema = xsdModelRoot.getSchema();
-        IType type = schema.getAllContainedTypes().iterator().next();
-        int typesNumber = schema.getAllContainedTypes().size();
-
-        assertNotNull(((Schema) schema).copyType(type, "HelloName"));
-
-        assertEquals(typesNumber + 1, schema.getAllContainedTypes().size());
-
-    }
-
-    @Test
     public void testGetExistingISchemaFromAdaptable() throws IOException, CoreException {
         IXSDModelRoot xsdModelRoot = getXSDModelRoot("pub/xsd/example.xsd", "example.xsd");
         XSDSchema xsdSchema = xsdModelRoot.getSchema().getComponent();
@@ -127,7 +113,7 @@
         assertEquals(1, targetSchema.length);
 
         CopyTypeCommand copyCommand = new CopyTypeCommand(targetSchema[0].getModelRoot(), wsdlModelRoot.getDescription(),
-                sourceType.getComponent(), targetSchema[0], sourceType.getName());
+                sourceType.getComponent(), targetSchema[0]);
         IStatus status = wsdlModelRoot.getEnv().execute(copyCommand);
         assertTrue(status.toString(), status.isOK());
 
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DataTypesFormPageController.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DataTypesFormPageController.java
index 408d2f4..557272d 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DataTypesFormPageController.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DataTypesFormPageController.java
@@ -1535,15 +1535,7 @@
     }
 
     public void handleCopyTypeAction(final Object[] selectedTreeNodes) {
-        List<IModelObject> modelObjectsToBeCopied = new ArrayList<IModelObject>();
-        for (Object object : selectedTreeNodes) {
-            if (object instanceof IDataTypesTreeNode) {
-                IDataTypesTreeNode datatypesTreeNode = (IDataTypesTreeNode) object;
-                modelObjectsToBeCopied.add(datatypesTreeNode.getModelObject());
-            }
-        }
-
-        ClipboardService.copyModelObjectsToClipboard(modelObjectsToBeCopied.toArray());
+        ClipboardService.copyModelObjectsToClipboard(selectedTreeNodes);
     }
 
     public void handlePasteTypeAction(final ITreeNode selectedTreeNode) {
@@ -1585,19 +1577,22 @@
 
     private void copyTypeAndSelectItOnTree(ISchema targetSchema, Object[] sourceModelObjects) {
         IType copiedType = null;
+        List<XSDNamedComponent> xsdComponentsForCopy = new ArrayList<XSDNamedComponent>();
 
         for (Object object : sourceModelObjects) {
+
             if (object instanceof INamedObject) {
                 INamedObject sourceModelObject = (INamedObject) object;
-                final CopyTypeCommand copyCommand = new CopyTypeCommand(model, targetSchema,
-                        (XSDNamedComponent) sourceModelObject.getComponent(), targetSchema, sourceModelObject.getName());
-
-                IStatus status = executeCommand(copyCommand);
-                copiedType = copyCommand.getCopiedType();
-                getDialogManager().showStatusDialog(Messages.DataTypesFormPageController_1, status);
+                xsdComponentsForCopy.add((XSDNamedComponent) sourceModelObject.getComponent());
             }
         }
 
+        final CopyTypeCommand copyCommand = new CopyTypeCommand(model, targetSchema, xsdComponentsForCopy, targetSchema);
+
+        IStatus status = executeCommand(copyCommand);
+        copiedType = copyCommand.getCopiedType();
+        getDialogManager().showStatusDialog(Messages.DataTypesFormPageController_1, status);
+
         if (copiedType != null) {
             fireTreeNodeSelectionEvent(copiedType);
         }
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/ClipboardService.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/ClipboardService.java
index 6c2bd97..0c26362 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/ClipboardService.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/ClipboardService.java
@@ -31,21 +31,22 @@
 public class ClipboardService {
     private static final String ERROR_ON_DOM_TRANSFORMATION = "Cannot get text resentation of model object. Paste of clipboard content as text will not be possible"; //$NON-NLS-1$
 
-    public static void copyModelObjectsToClipboard(Object[] objects) {
+    public static void copyModelObjectsToClipboard(Object[] selectedObjects) {
         Clipboard clipboard = new Clipboard(Display.getCurrent());
-        List<IModelObject> modelObjectsToCopy = new ArrayList<IModelObject>();
 
         String modelObjectAsText = ""; //$NON-NLS-1$
-        for (Object object : objects) {
-            if (object instanceof IModelObject) {
-                IModelObject modelObject = (IModelObject) object;
+        List<IModelObject> modelObjectsToBeCopied = new ArrayList<IModelObject>();
+        for (Object object : selectedObjects) {
+            if (object instanceof IDataTypesTreeNode) {
+                IDataTypesTreeNode datatypesTreeNode = (IDataTypesTreeNode) object;
+                IModelObject modelObject = datatypesTreeNode.getModelObject();
+                modelObjectsToBeCopied.add(modelObject);
                 modelObjectAsText += getModelObjectAsText(modelObject);
-                modelObjectsToCopy.add(modelObject);
             }
         }
 
-        clipboard.setContents(new Object[] { modelObjectsToCopy.toArray(), modelObjectAsText },
-                new Transfer[] { SiEditorTransfer.getInstance(), TextTransfer.getInstance() });
+        clipboard.setContents(new Object[] { modelObjectsToBeCopied.toArray(), modelObjectAsText }, new Transfer[] {
+                SiEditorTransfer.getInstance(), TextTransfer.getInstance() });
     }
 
     private static String getModelObjectAsText(IModelObject modelObject) {
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/handlers/CopyHandler.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/handlers/CopyHandler.java
index aafdf3e..8ef98f5 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/handlers/CopyHandler.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/clipboard/handlers/CopyHandler.java
@@ -1,5 +1,8 @@
 package org.eclipse.wst.sse.sieditor.ui.v2.dt.clipboard.handlers;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
@@ -11,12 +14,13 @@
 import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.wst.sse.sieditor.ui.i18n.Messages;
 import org.eclipse.wst.sse.sieditor.ui.v2.dt.clipboard.ClipboardService;
+import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
 
 public class CopyHandler extends AbstractHandler {
 
     @Override
     public Object execute(ExecutionEvent event) throws ExecutionException {
-        TreeItem[] selectedTreeNodes = getSelectedTreeNode();
+        ITreeNode[] selectedTreeNodes = getSelectedTreeNode();
 
         if (!ClipboardService.isCopyEnabled(selectedTreeNodes)) {
             showNotPosibleDialog();
@@ -28,14 +32,23 @@
         return null;
     }
 
-    private TreeItem[] getSelectedTreeNode() {
+    private ITreeNode[] getSelectedTreeNode() {
         Control focusControl = Display.getCurrent().getFocusControl();
         if (!(focusControl instanceof Tree)) {
             return null;
         }
 
+        List<ITreeNode> result = new ArrayList<ITreeNode>();
+
         Tree tree = (Tree) focusControl;
-        return tree.getSelection();
+        for (TreeItem treeItem : tree.getSelection()) {
+            Object data = treeItem.getData();
+            if (data instanceof ITreeNode) {
+                result.add((ITreeNode) data);
+            }
+        }
+
+        return result.toArray(new ITreeNode[0]);
     }
 
     private void showNotPosibleDialog() {
