fixed copy/paste of multiple projects
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() {