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 1f6b6c1..bee314c 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
@@ -77,39 +77,35 @@
 import org.eclipse.xsd.XSDTypeDefinition;
 import org.eclipse.xsd.util.XSDConstants;
 
-/**
- * 
- * 
- */
 public class CopyTypeCommand extends AbstractNotificationOperation {
 
-    private final XSDNamedComponent _sourceType;
-    private AbstractType _clone;
-    private final IModelObject _parent;
-    private Map<String, XSDSchema> _schemasUsed;
-    private final ISchema _targetSchema;
-    private final String _name;
+    private final XSDNamedComponent sourceType;
+    private AbstractType clone;
+    private final IModelObject parent;
+    private Map<String, XSDSchema> schemasUsed;
+    private final ISchema targetSchema;
+    private final String name;
 
     // List of all the components copied to targetschema
-    private final HashSet<XSDNamedComponent> _inconsistentClones = new HashSet<XSDNamedComponent>();
-    private XSDNamedComponent _clonedComponent;
+    private final HashSet<XSDNamedComponent> inconsistentClones = new HashSet<XSDNamedComponent>();
+    private XSDNamedComponent clonedComponent;
 
-    private IStatus _executionStatus;
+    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) {
         super(root, modelObject, Messages.CopyTypeCommand_copy_type_comand_label);
-        this._sourceType = typeToBeCopied;
-        this._parent = modelObject;
-        this._targetSchema = targetSchema;
-        this._name = name;
+        this.sourceType = typeToBeCopied;
+        this.parent = modelObject;
+        this.targetSchema = targetSchema;
+        this.name = name;
     }
 
     @Override
     public boolean canExecute() {
-        return null != getModelRoot() && null != _parent && null != _sourceType && _sourceType.eResource() != null;
+        return null != getModelRoot() && null != parent && null != sourceType && sourceType.eResource() != null;
     }
 
     @SuppressWarnings("unchecked")
@@ -144,33 +140,33 @@
         if (debug)
             Logger.getDebugTrace().traceEntry(""); //$NON-NLS-1$
 
-        _executionStatus = Status.OK_STATUS;
-        _schemasUsed = new HashMap<String, XSDSchema>();
-        final XSDNamedComponent component = _sourceType;
+        executionStatus = Status.OK_STATUS;
+        schemasUsed = new HashMap<String, XSDSchema>();
+        final XSDNamedComponent component = sourceType;
         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) {
             if (debug)
-                Logger.getDebugTrace().trace("", "Begin copy Element " + _sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+                Logger.getDebugTrace().trace("", "Begin copy Element " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
             visitElementDeclaration((XSDElementDeclaration) component, schema);
             if (debug)
-                Logger.getDebugTrace().trace("", "End copy Element " + _sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
+                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$
+                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$
+                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$
+                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("", "End copy Attribute " + sourceType.getName()); //$NON-NLS-1$ //$NON-NLS-2$
         }
 
         // update all the references to the target schema components
@@ -185,22 +181,22 @@
             description.refreshSchemas();
         }
 
-        if (isGlobal && _clonedComponent != null) {
+        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());
+            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()));
+        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 executionStatus;
     }
 
     private boolean isGlobal(final XSDNamedComponent component) {
@@ -228,7 +224,7 @@
             Logger.getDebugTrace().traceEntry(""); //$NON-NLS-1$
         if (debug)
             Logger.getDebugTrace().traceExit(""); //$NON-NLS-1$
-        return _clone;
+        return clone;
     }
 
     private boolean visitAttributeGroup(final XSDAttributeGroupDefinition attributeGroup, final XSDSchema source) {
@@ -254,11 +250,11 @@
                 if (debug)
                     Logger.getDebugTrace().trace("", "component already exists"); //$NON-NLS-1$ //$NON-NLS-2$				
                 // return if source is null
-                if (null == source || (copyToTarget && source.equals(_targetSchema.getComponent()))) {
+                if (null == source || (copyToTarget && source.equals(targetSchema.getComponent()))) {
                     return needsUpdate;
                 } else {
                     // ensure import and return, no need to transverse type here
-                    ensureImport(source, copyToTarget ? _targetSchema.getNamespace() : attributeGroup.getTargetNamespace(), null);
+                    ensureImport(source, copyToTarget ? targetSchema.getNamespace() : attributeGroup.getTargetNamespace(), null);
                     return needsUpdate;
                 }
             } else {
@@ -285,7 +281,7 @@
             }
         } else {
             if (visitAttributeGroupContent(attributeGroup.getContents(), copiedTo))
-                _inconsistentClones.add(clone);
+                inconsistentClones.add(clone);
         }
 
         if (debug)
@@ -304,11 +300,11 @@
             final XSDAttributeDeclaration match = contains(attribute, XSDAttributeDeclaration.class, copyToTarget);
             if (null != match) {
                 // return if source is null
-                if (null == source || (copyToTarget && source.equals(_targetSchema.getComponent()))) {
+                if (null == source || (copyToTarget && source.equals(targetSchema.getComponent()))) {
                     return needsUpdate;
                 } else {
                     // ensure import and return, no need to transverse type here
-                    ensureImport(source, copyToTarget ? _targetSchema.getNamespace() : attribute.getTargetNamespace(), null);
+                    ensureImport(source, copyToTarget ? targetSchema.getNamespace() : attribute.getTargetNamespace(), null);
                     return needsUpdate;
                 }
             } else {
@@ -337,7 +333,7 @@
             // itself
             if ((!(null == typeDefinition || isSynthetic(typeDefinition))) && isTargetSchemaComponent(typeDefinition)) {
                 if (attribute.isGlobal()) {
-                    _inconsistentClones.add(clone);
+                    inconsistentClones.add(clone);
                     refersTargetComp = true;
                 } else
                     needsUpdate = true;
@@ -353,7 +349,7 @@
             // itself
             if (refersTargetComp && null != attribute.getAnonymousTypeDefinition()) {
                 if (attribute.isGlobal()) {
-                    _inconsistentClones.add(clone);
+                    inconsistentClones.add(clone);
                 } else
                     needsUpdate = true;
             }
@@ -384,16 +380,14 @@
             final XSDElementDeclaration match = contains(element, XSDElementDeclaration.class, copyToTarget);
             if (null != match) {
                 // return if source is null
-                if (null == source || (copyToTarget && source.equals(_targetSchema.getComponent()))) {
-                    return needsUpdate;
-                } else {
+                if (!(null == source || (copyToTarget && source.equals(targetSchema.getComponent())))) {
                     // ensure import and return, no need to transverse type here
-                    ensureImport(source, copyToTarget ? _targetSchema.getNamespace() : element.getTargetNamespace(), null);
-                    return needsUpdate;
+                    ensureImport(source, copyToTarget ? targetSchema.getNamespace() : element.getTargetNamespace(), null);
                 }
             } else {
-                if ((!copyToTarget) && ensureImport(source, element.getTargetNamespace(), element))
-                    return needsUpdate;
+                if (!copyToTarget) {
+                    ensureImport(source, element.getTargetNamespace(), element);
+                }
             }
             // copy and create reference in source
             copiedTo = createClone(element, copyToTarget);
@@ -418,7 +412,7 @@
             // element to add itself
             if ((!(null == typeDefinition || isSynthetic(typeDefinition))) && isTargetSchemaComponent(typeDefinition)) {
                 if (element.isGlobal()) {
-                    _inconsistentClones.add(clone);
+                    inconsistentClones.add(clone);
                     refersTargetComp = true;
                 } else
                     needsUpdate = true;
@@ -434,7 +428,7 @@
             // itself
             if (refersTargetComp && null != element.getAnonymousTypeDefinition()) {
                 if (element.isGlobal()) {
-                    _inconsistentClones.add(clone);
+                    inconsistentClones.add(clone);
                 } else
                     needsUpdate = true;
             }
@@ -464,11 +458,11 @@
             final XSDModelGroupDefinition match = contains(modelGroupDefinition, XSDModelGroupDefinition.class, copyToTarget);
             if (null != match) {
                 // return if source is null
-                if (null == source || (copyToTarget && source.equals(_targetSchema.getComponent()))) {
+                if (null == source || (copyToTarget && source.equals(targetSchema.getComponent()))) {
                     return needsUpdate;
                 } else {
                     // ensure import and return, no need to transverse type here
-                    ensureImport(source, copyToTarget ? _targetSchema.getNamespace() : modelGroupDefinition.getTargetNamespace(),
+                    ensureImport(source, copyToTarget ? targetSchema.getNamespace() : modelGroupDefinition.getTargetNamespace(),
                             null);
                     return needsUpdate;
                 }
@@ -496,7 +490,7 @@
         } else {
             final XSDModelGroup content = modelGroupDefinition.getModelGroup();
             if (null != content && visitModelGroup(content, copiedTo))
-                _inconsistentClones.add(clone);
+                inconsistentClones.add(clone);
         }
         return needsUpdate;
     }
@@ -528,16 +522,13 @@
             final XSDSimpleTypeDefinition match = contains(simpleType, XSDSimpleTypeDefinition.class, copyToTarget);
             if (null != match) {
                 // return if source is null
-                if (null == source || (copyToTarget && source.equals(_targetSchema.getComponent()))) {
-                    return needsUpdate;
-                } else {
-                    // ensure import and return, no need to transverse type here
-                    ensureImport(source, copyToTarget ? _targetSchema.getNamespace() : simpleType.getTargetNamespace(), null);
-                    return needsUpdate;
+                if (!(null == source || (copyToTarget && source.equals(targetSchema.getComponent())))) {
+                    ensureImport(source, copyToTarget ? targetSchema.getNamespace() : simpleType.getTargetNamespace(), null);
                 }
             } else {
-                if ((!copyToTarget) && ensureImport(source, simpleType.getTargetNamespace(), simpleType))
-                    return needsUpdate;
+                if (!copyToTarget) {
+                    ensureImport(source, simpleType.getTargetNamespace(), simpleType);
+                }
             }
             // copy and create reference in source
             copiedTo = createClone(simpleType, copyToTarget);
@@ -565,7 +556,7 @@
                 final boolean refersTargetComp = visitTypeDefinition(type, copiedTo);
                 final boolean isTargetComp = null == type.getName() ? false : isTargetSchemaComponent(type);
                 if (globalType && (isTargetComp || refersTargetComp)) {
-                    _inconsistentClones.add(clone);
+                    inconsistentClones.add(clone);
                 } else if (!globalType && (isTargetComp || refersTargetComp)) {
                     needsUpdate = true;
                 }
@@ -589,16 +580,14 @@
             final XSDComplexTypeDefinition match = contains(complexType, XSDComplexTypeDefinition.class, copyToTarget);
             if (null != match) {
                 // return if source is null
-                if (null == source || (copyToTarget && source.equals(_targetSchema.getComponent()))) {
-                    return needsUpdate;
-                } else {
+                if (!(null == source || (copyToTarget && source.equals(targetSchema.getComponent())))) {
                     // ensure import and return, no need to transverse type here
-                    ensureImport(source, copyToTarget ? _targetSchema.getNamespace() : complexType.getTargetNamespace(), null);
-                    return needsUpdate;
+                    ensureImport(source, copyToTarget ? targetSchema.getNamespace() : complexType.getTargetNamespace(), null);
                 }
             } else {
-                if ((!copyToTarget) && ensureImport(source, complexType.getTargetNamespace(), complexType))
-                    return needsUpdate;
+                if (!copyToTarget) {
+                    ensureImport(source, complexType.getTargetNamespace(), complexType);
+                }
             }
             // copy and create reference in source
             copiedTo = createClone(complexType, copyToTarget);
@@ -635,7 +624,7 @@
         refersTargetComp |= visitAttributeGroupContent(attributeContents, copiedTo);
 
         if (globalType && (isTargetComp || refersTargetComp)) {
-            _inconsistentClones.add(clone);
+            inconsistentClones.add(clone);
         } else if (!globalType && (isTargetComp || refersTargetComp)) {
             needsUpdate = true;
         }
@@ -695,20 +684,20 @@
      */
     private XSDSchema createClone(final XSDNamedComponent component, final boolean copyToTarget) {
         final XSDSchema schema;
-        schema = copyToTarget ? _targetSchema.getComponent() : ensureSchema(component.getTargetNamespace());
+        schema = copyToTarget ? targetSchema.getComponent() : ensureSchema(component.getTargetNamespace());
 
         final XSDNamedComponent clone = EmfXsdUtils.cloneWithAnnotation(component, schema);
 
-        clone.setTargetNamespace(copyToTarget ? _targetSchema.getNamespace() : component.getTargetNamespace());
+        clone.setTargetNamespace(copyToTarget ? targetSchema.getNamespace() : component.getTargetNamespace());
 
         if (copyToTarget)
-            _inconsistentClones.add(clone);
+            inconsistentClones.add(clone);
 
         // Set new name to the cloned component if its a source component
-        if (copyToTarget && component == _sourceType) {
-            Assert.isTrue(null == _clonedComponent);
-            _clonedComponent = clone;
-            (clone).setName(_name);
+        if (copyToTarget && component == sourceType) {
+            Assert.isTrue(null == clonedComponent);
+            clonedComponent = clone;
+            (clone).setName(name);
         }
         _recentClone = clone;
         return schema;
@@ -721,7 +710,7 @@
         final Collection<XSDSchema> schemas;
         if (copyToTarget) {
             schemas = new ArrayList<XSDSchema>(1);
-            schemas.add(_targetSchema.getComponent());
+            schemas.add(targetSchema.getComponent());
         } else {
             // Get schemas with same namespace
             schemas = CollectionTypeUtils.findAll(getInlineSchemas(), new Condition<XSDSchema>() {
@@ -752,9 +741,9 @@
         // 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;
+        if (copyToTarget && (null != sourceType.getName() && sourceType.getName().equals(name))
+                && metaClass.isInstance(sourceType)) {
+            name = name;
         }
 
         final EList<XSDSchemaContent> contents = schema.getContents();
@@ -841,8 +830,8 @@
                 directive.setSchemaLocation(schemaRelativePath);
 
                 XSDSchema resolvedSchema = directive.getResolvedSchema();
-                if (resolvedSchema == null && _parent instanceof Description) {
-                    final List<Schema> resolvedSchemas = ((Description) _parent).getSchemaResolver().resolveSchema(nameSpace,
+                if (resolvedSchema == null && this.parent instanceof Description) {
+                    final List<Schema> resolvedSchemas = ((Description) this.parent).getSchemaResolver().resolveSchema(nameSpace,
                             null);
                     if (!resolvedSchemas.isEmpty()) {
                         resolvedSchema = resolvedSchemas.get(0).getComponent();
@@ -874,7 +863,7 @@
 
     @SuppressWarnings("unchecked")
     private XSDSchema ensureSchema(final String namespace) {
-        XSDSchema schema = _schemasUsed.get(namespace);
+        XSDSchema schema = schemasUsed.get(namespace);
 
         if (null == schema) {
             final Collection<XSDSchema> schemas = CollectionTypeUtils.findAll(getInlineSchemas(), new Condition<XSDSchema>() {
@@ -926,7 +915,7 @@
                 definition.addNamespace(wsdlXmlnsPrefix, namespace);
             }
 
-            _schemasUsed.put(namespace, schema);
+            schemasUsed.put(namespace, schema);
         }
         return schema;
     }
@@ -935,7 +924,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 = sourceType.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())
@@ -963,7 +952,7 @@
 
     private void updateComponents() {
         // DOIT fix cyclic reference for name change
-        for (final XSDNamedComponent component : _inconsistentClones) {
+        for (final XSDNamedComponent component : inconsistentClones) {
             if (component instanceof XSDTypeDefinition)
                 updateComponent((XSDTypeDefinition) component);
             else if (component instanceof XSDElementDeclaration)
@@ -1125,8 +1114,8 @@
             return null;
         final String name = component.getName();
         final String namespace = component.getTargetNamespace();
-        if (null != namespace && namespace.equals(_sourceType.getSchema().getTargetNamespace())) {
-            final XSDSchema schema = _targetSchema.getComponent();
+        if (null != namespace && namespace.equals(sourceType.getSchema().getTargetNamespace())) {
+            final XSDSchema schema = targetSchema.getComponent();
             for (final XSDSchemaContent content : schema.getContents()) {
                 if (componentType.isInstance(content) && name.equals(((XSDNamedComponent) content).getName())) {
                     return (T) content;
@@ -1137,7 +1126,7 @@
     }
 
     public void updateReferences(final XSDNamedComponent component) {
-        _inconsistentClones.add(component);
+        inconsistentClones.add(component);
     }
 
     @Override
diff --git a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/Messages.java b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/Messages.java
index 6d6577d..3874506 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/Messages.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/Messages.java
@@ -14,6 +14,7 @@
 
 public class Messages extends NLS {
     private static final String BUNDLE_NAME = "org.eclipse.wst.sse.sieditor.search.i18n.messages"; //$NON-NLS-1$
+    public static String AbstractSearchQueryOperation_pregressMonitorMessagePrefix;
     public static String AllCategoriesXsdDestination_DisplayName;
     public static String AllInterfacesDestination_Name;
     public static String CopyAction_Label;
diff --git a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/messages.properties b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/messages.properties
index c99d70e..2a94a4a 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/messages.properties
+++ b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/i18n/messages.properties
@@ -8,6 +8,7 @@
 # Contributors:
 #     Georgi Konstantinov - initial API and implementation.
 ###############################################################################
+AbstractSearchQueryOperation_pregressMonitorMessagePrefix=Searching in 
 AllCategoriesXsdDestination_DisplayName=All Categories
 AllInterfacesDestination_Name=All Interfaces
 CopyAction_Label=Copy
diff --git a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/provider/AbstractSearchQueryOperation.java b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/provider/AbstractSearchQueryOperation.java
index 2f3a088..ae56048 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/provider/AbstractSearchQueryOperation.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/provider/AbstractSearchQueryOperation.java
@@ -32,6 +32,7 @@
 import org.eclipse.wst.sse.sieditor.core.common.Logger;
 import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
 import org.eclipse.wst.sse.sieditor.model.impl.WSDLFactory;
+import org.eclipse.wst.sse.sieditor.search.i18n.Messages;
 import org.eclipse.wst.sse.sieditor.search.ui.tree.FileNode;
 import org.eclipse.wst.sse.sieditor.search.ui.tree.NamespaceNode;
 import org.eclipse.wst.sse.sieditor.search.ui.tree.RootTreeNode;
@@ -55,7 +56,7 @@
     @Override
     public ITreeNode run(IProgressMonitor progressMonitor) throws LongOpCanceledException, CoreException {
         Set<IFile> files = getFilesFromWorkspace();
-        progressMonitor.beginTask("", files.size());
+        progressMonitor.beginTask("", files.size()); //$NON-NLS-1$
         return getRootTreeNode(files, progressMonitor);
     }
 
@@ -67,7 +68,7 @@
                 progressMonitor.done();
                 return rootTreeNode;
             }
-            progressMonitor.subTask("Searching in " + file.getName());
+            progressMonitor.subTask(Messages.AbstractSearchQueryOperation_pregressMonitorMessagePrefix + file.getName());
             progressMonitor.worked(1);
 
             FileNode fileNode = new FileNode(file, rootTreeNode, isXsdFileExtension(file.getFileExtension()));
diff --git a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/ui/actions/CopyAction.java b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/ui/actions/CopyAction.java
index 9f3e0e0..2c35568 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/ui/actions/CopyAction.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.search/src/org/eclipse/wst/sse/sieditor/search/ui/actions/CopyAction.java
@@ -10,35 +10,36 @@
  *******************************************************************************/
 package org.eclipse.wst.sse.sieditor.search.ui.actions;
 
+import org.eclipse.jface.action.Action;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.wst.sse.sieditor.search.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 CopyAction extends AbstractActiveOnSingleSelectionAction {
+public class CopyAction extends Action {
+
+    private ISelection selection;
 
     public CopyAction(ISelection selection) {
-        super(selection);
+        this.selection = selection;
     }
 
     @Override
     public void run() {
-        final Object firstElementFromSelection = getStructuredSelectionFirstElement();
-
-        IModelObject modelObject = ((ITreeNode) firstElementFromSelection).getModelObject();
-
-        ClipboardService.copyModelObjectToClipboard(modelObject);
+        ClipboardService.copyModelObjectsToClipboard(((IStructuredSelection) selection).toArray());
     }
 
     @Override
     public boolean isEnabled() {
+        if (!(selection instanceof IStructuredSelection)) {
+            return false;
+        }
+
         if (!super.isEnabled()) {
             return false;
         }
 
-        Object firstElement = getStructuredSelectionFirstElement();
-        return ClipboardService.isCopyEnabled(firstElement);
+        return ClipboardService.isCopyEnabled(((IStructuredSelection) selection).toArray());
     }
 
     @Override
diff --git a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerJUnitTest.java b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerJUnitTest.java
index 719fb55..33f0cb0 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerJUnitTest.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerJUnitTest.java
@@ -1848,8 +1848,8 @@
 
         final DataTypesFormPageController controller = new DataTypesFormPageController(modelRoot, true);
 
-        assertTrue(controller.isCopyEnabled(selectedNode));
-        assertFalse(controller.isCopyEnabled(null));
+        assertTrue(controller.isCopyEnabled(new Object[] { selectedNode }));
+        assertFalse(controller.isCopyEnabled(new Object[] { null }));
 
     }
 
diff --git a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerPlugInTest.java b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerPlugInTest.java
index 26b7e89..8cd851c 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerPlugInTest.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.test/api/org/eclipse/wst/sse/sieditor/test/ui/v2/dt/DataTypesFormPageControllerPlugInTest.java
@@ -538,9 +538,9 @@
         expect(selectedTreeNode.getModelObject()).andReturn(typeToCopy).anyTimes();
         replay(selectedTreeNode);
 
-        assertTrue(controller.isCopyEnabled(selectedTreeNode));
+        assertTrue(controller.isCopyEnabled(new Object[] { selectedTreeNode }));
 
-        controller.handleCopyTypeAction(selectedTreeNode);
+        controller.handleCopyTypeAction(new Object[] { selectedTreeNode });
 
         final INamespaceNode targetTreeNode = createNiceMock(INamespaceNode.class);
         expect(targetTreeNode.getModelObject()).andReturn(targetSchemas[0]).anyTimes();
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DTTreeContextMenuListener.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DTTreeContextMenuListener.java
index 708c793..fe8ffa5 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DTTreeContextMenuListener.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/DTTreeContextMenuListener.java
@@ -338,8 +338,7 @@
             copyTypeAction = new Action(Messages.DTTreeContextMenuListener_0, Action.AS_PUSH_BUTTON) {
                 @Override
                 public void run() {
-                    getController().handleCopyTypeAction(
-                            (ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
+                    getController().handleCopyTypeAction(((IStructuredSelection) treeViewer.getSelection()).toArray());
                 }
             };
             copyTypeAction.setId(ContextMenuConstants.COPY_TYPE_ACTION_ID);
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 8da63b8..408d2f4 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
@@ -1466,7 +1466,7 @@
         return isAddTypeEnabled(selectedTreeNode);
     }
 
-    public boolean isCopyEnabled(final IDataTypesTreeNode selectedNode) {
+    public boolean isCopyEnabled(Object[] selectedNode) {
         return ClipboardService.isCopyEnabled(selectedNode);
     }
 
@@ -1501,7 +1501,7 @@
         }
     }
 
-    public boolean handleDropTypeIntoEditor(AbstractModelRoot modelRoot, INamedObject typeToBeCopied, ITreeNode dropTarget) {
+    public boolean handleDropTypeIntoEditor(AbstractModelRoot modelRoot, Object[] typesToBeCopied, ITreeNode dropTarget) {
         ISchema targetSchema = null;
 
         if (modelRoot instanceof IXSDModelRoot) {
@@ -1515,11 +1515,12 @@
             targetSchema = (ISchema) namespaceNode.getModelObject();
         }
 
-        if (typeToBeCopied.getParent() == targetSchema) {
+        if (typesToBeCopied.length > 1 && typesToBeCopied[0] instanceof IModelObject
+                && ((IModelObject) typesToBeCopied[0]).getParent() == targetSchema) {
             return true;
         }
 
-        copyTypeAndSelectItOnTree(targetSchema, typeToBeCopied);
+        copyTypeAndSelectItOnTree(targetSchema, typesToBeCopied);
 
         return true;
     }
@@ -1533,13 +1534,16 @@
         return getNamespaceNode(parent);
     }
 
-    public void handleCopyTypeAction(final ITreeNode selectedTreeNode) {
-        final IModelObject selectionModelObject = selectedTreeNode.getModelObject();
-        if (selectionModelObject == null || !(selectionModelObject instanceof IType)) {
-            throw new IllegalArgumentException("Tree node selection must be IType but was:" + selectionModelObject); //$NON-NLS-1$
+    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.copyModelObjectToClipboard((INamedObject) selectionModelObject);
+        ClipboardService.copyModelObjectsToClipboard(modelObjectsToBeCopied.toArray());
     }
 
     public void handlePasteTypeAction(final ITreeNode selectedTreeNode) {
@@ -1556,7 +1560,7 @@
             return;
         }
 
-        INamedObject sourceModelObject = (INamedObject) ClipboardService.getModelObjectFromClipboard();
+        Object[] sourceModelObject = ClipboardService.getModelObjectsFromClipboard();
         if (sourceModelObject == null) {
             return;
         }
@@ -1579,15 +1583,20 @@
         return targetSchema;
     }
 
-    private void copyTypeAndSelectItOnTree(ISchema targetSchema, INamedObject sourceModelObject) {
+    private void copyTypeAndSelectItOnTree(ISchema targetSchema, Object[] sourceModelObjects) {
         IType copiedType = null;
 
-        final CopyTypeCommand copyCommand = new CopyTypeCommand(model, targetSchema,
-                (XSDNamedComponent) sourceModelObject.getComponent(), targetSchema, sourceModelObject.getName());
+        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);
+                IStatus status = executeCommand(copyCommand);
+                copiedType = copyCommand.getCopiedType();
+                getDialogManager().showStatusDialog(Messages.DataTypesFormPageController_1, status);
+            }
+        }
 
         if (copiedType != null) {
             fireTreeNodeSelectionEvent(copiedType);
@@ -1595,18 +1604,23 @@
     }
 
     public boolean isPasteEnabled(final IDataTypesTreeNode selectedNode) {
-        IModelObject sourceModelObject = ClipboardService.getModelObjectFromClipboard();
+        Object[] sourceModelObjects = ClipboardService.getModelObjectsFromClipboard();
 
         if (selectedNode == null && !(model instanceof XSDModelRoot)) {
             return false;
         }
 
-        if (sourceModelObject == null) {
+        if (sourceModelObjects == null || sourceModelObjects.length == 0) {
             return false;
         }
 
-        if (sourceModelObject.getComponent().eResource() == null) {
-            return false;
+        for (Object object : sourceModelObjects) {
+            if (object instanceof IModelObject) {
+                IModelObject modelObject = (IModelObject) object;
+                if (modelObject.getComponent().eResource() == null) {
+                    return false;
+                }
+            }
         }
 
         if ((selectedNode != null && selectedNode.isReadOnly()) || isResourceReadOnly()) {
@@ -1614,6 +1628,7 @@
         }
 
         return true;
+
     }
 
     public void editItemNameTriggered(final ITreeNode treeNode, final String newName) {
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/IDataTypesFormPageController.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/IDataTypesFormPageController.java
index 80a24ca..c05e5d9 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/IDataTypesFormPageController.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/IDataTypesFormPageController.java
@@ -22,9 +22,9 @@
 import org.eclipse.wst.sse.sieditor.model.xsd.api.IFacet;
 import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
 import org.eclipse.wst.sse.sieditor.model.xsd.api.ISimpleType;
+import org.eclipse.wst.sse.sieditor.model.xsd.api.ISimpleType.Whitespace;
 import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType;
 import org.eclipse.wst.sse.sieditor.model.xsd.api.IType;
-import org.eclipse.wst.sse.sieditor.model.xsd.api.ISimpleType.Whitespace;
 import org.eclipse.wst.sse.sieditor.model.xsd.impl.Schema;
 import org.eclipse.wst.sse.sieditor.model.xsd.impl.StructureType;
 import org.eclipse.wst.sse.sieditor.ui.v2.IFormPageController;
@@ -217,7 +217,7 @@
     public void deleteSimpleTypeEnumFacet(ISimpleType type, IFacet facet);
 
     public void setStructureTypeContent(IStructureType structure, IType type);
-    
+
     public void setStructureType(IStructureType structure, IType type);
 
     public void setGlobalElementNillable(IStructureType structure, boolean nillable);
@@ -258,9 +258,9 @@
 
     public boolean isAddGlobalElementEnabled(IDataTypesTreeNode selectedTreeNode);
 
-    public boolean isCopyEnabled(IDataTypesTreeNode treeNode);
+    public boolean isCopyEnabled(Object[] treeNode);
 
-    public void handleCopyTypeAction(ITreeNode firstElement);
+    public void handleCopyTypeAction(Object[] firstElement);
 
     public void handlePasteTypeAction(ITreeNode firstElement);
 
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/actionenablement/DataTypesEditorActionEnablementForSelectionManager.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/actionenablement/DataTypesEditorActionEnablementForSelectionManager.java
index dbf8de7..e971cfe 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/actionenablement/DataTypesEditorActionEnablementForSelectionManager.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/actionenablement/DataTypesEditorActionEnablementForSelectionManager.java
@@ -174,7 +174,7 @@
     }
 
     protected boolean isCopyEnabled(final IStructuredSelection selection) {
-        return controller.isCopyEnabled((IDataTypesTreeNode) selection.getFirstElement());
+        return controller.isCopyEnabled(selection.toArray());
     }
 
     protected boolean isPasteEnabled(final IStructuredSelection selection) {
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 09640aa..6c2bd97 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
@@ -2,6 +2,8 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
@@ -29,12 +31,21 @@
 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 copyModelObjectToClipboard(IModelObject modelObject) {
+    public static void copyModelObjectsToClipboard(Object[] objects) {
         Clipboard clipboard = new Clipboard(Display.getCurrent());
+        List<IModelObject> modelObjectsToCopy = new ArrayList<IModelObject>();
 
-        String modelObjectAsText = getModelObjectAsText(modelObject);
-        clipboard.setContents(new Object[] { modelObject, modelObjectAsText }, new Transfer[] { SiEditorTransfer.getInstance(),
-                TextTransfer.getInstance() });
+        String modelObjectAsText = ""; //$NON-NLS-1$
+        for (Object object : objects) {
+            if (object instanceof IModelObject) {
+                IModelObject modelObject = (IModelObject) object;
+                modelObjectAsText += getModelObjectAsText(modelObject);
+                modelObjectsToCopy.add(modelObject);
+            }
+        }
+
+        clipboard.setContents(new Object[] { modelObjectsToCopy.toArray(), modelObjectAsText },
+                new Transfer[] { SiEditorTransfer.getInstance(), TextTransfer.getInstance() });
     }
 
     private static String getModelObjectAsText(IModelObject modelObject) {
@@ -81,18 +92,27 @@
         return null;
     }
 
-    public static IModelObject getModelObjectFromClipboard() {
+    public static Object[] getModelObjectsFromClipboard() {
         Clipboard clipboard = new Clipboard(Display.getCurrent());
-        return (IModelObject) clipboard.getContents(SiEditorTransfer.getInstance());
+        return (Object[]) clipboard.getContents(SiEditorTransfer.getInstance());
     }
 
-    public static boolean isCopyEnabled(Object selectedNode) {
-        if (!(selectedNode instanceof IDataTypesTreeNode)) {
+    public static boolean isCopyEnabled(Object[] selectedNodes) {
+        if (selectedNodes == null || selectedNodes.length == 0) {
             return false;
         }
 
-        final IModelObject modelObject = ((IDataTypesTreeNode) selectedNode).getModelObject();
-        return modelObject instanceof IType;
+        for (Object selectedNode : selectedNodes) {
+            if (!(selectedNode instanceof IDataTypesTreeNode)) {
+                return false;
+            }
+
+            final IModelObject modelObject = ((IDataTypesTreeNode) selectedNode).getModelObject();
+            if (!(modelObject instanceof IType)) {
+                return false;
+            }
+        }
+        return true;
     }
 
 }
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 5b7a681..aafdf3e 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
@@ -11,43 +11,31 @@
 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.dt.nodes.IDataTypesTreeNode;
-import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
 
 public class CopyHandler extends AbstractHandler {
 
     @Override
     public Object execute(ExecutionEvent event) throws ExecutionException {
-        ITreeNode selectedTreeNode = getSelectedTreeNode();
+        TreeItem[] selectedTreeNodes = getSelectedTreeNode();
 
-        if (!ClipboardService.isCopyEnabled((IDataTypesTreeNode) selectedTreeNode)) {
+        if (!ClipboardService.isCopyEnabled(selectedTreeNodes)) {
             showNotPosibleDialog();
             return null;
         }
 
-        ClipboardService.copyModelObjectToClipboard(selectedTreeNode.getModelObject());
+        ClipboardService.copyModelObjectsToClipboard(selectedTreeNodes);
 
         return null;
     }
 
-    private ITreeNode getSelectedTreeNode() {
+    private TreeItem[] getSelectedTreeNode() {
         Control focusControl = Display.getCurrent().getFocusControl();
         if (!(focusControl instanceof Tree)) {
             return null;
         }
 
         Tree tree = (Tree) focusControl;
-        TreeItem[] selection = tree.getSelection();
-        if (selection.length != 1) {
-            return null;
-        }
-
-        Object selectionData = selection[0].getData();
-        if (selectionData instanceof ITreeNode) {
-            return (ITreeNode) selectionData;
-        }
-
-        return null;
+        return tree.getSelection();
     }
 
     private void showNotPosibleDialog() {
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/SiEditorTransfer.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/SiEditorTransfer.java
index 6d79e63..b310a5b 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/SiEditorTransfer.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/SiEditorTransfer.java
@@ -9,17 +9,13 @@
 import org.eclipse.jface.util.Policy;
 import org.eclipse.swt.dnd.ByteArrayTransfer;
 import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.wst.sse.sieditor.model.api.INamedObject;
 
-/**
- * Class for serializing gadgets to/from a byte array
- */
 public class SiEditorTransfer extends ByteArrayTransfer {
     private static SiEditorTransfer instance = new SiEditorTransfer();
     private static final String TYPE_NAME = "sie-transfer-format"; //$NON-NLS-1$
     private static final int TYPEID = registerType(TYPE_NAME);
 
-    private WeakReference<INamedObject> modelObject;
+    private WeakReference<Object[]> modelObject;
 
     public static SiEditorTransfer getInstance() {
         return instance;
@@ -32,9 +28,6 @@
         return new int[] { TYPEID };
     }
 
-    /*
-     * Method declared on Transfer.
-     */
     protected String[] getTypeNames() {
         return new String[] { TYPE_NAME };
     }
@@ -51,7 +44,7 @@
     public void javaToNative(Object object, TransferData transferData) {
         byte[] check = TYPE_NAME.getBytes(Charset.forName("UTF-8")); //$NON-NLS-1$
         super.javaToNative(check, transferData);
-        modelObject = new WeakReference<INamedObject>((INamedObject) object);
+        modelObject = new WeakReference<Object[]>((Object[]) object);
     }
 
     public Object nativeToJava(TransferData transferData) {
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDragAdapter.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDragAdapter.java
new file mode 100644
index 0000000..3dea376
--- /dev/null
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDragAdapter.java
@@ -0,0 +1,45 @@
+package org.eclipse.wst.sse.sieditor.ui.v2.dt.dnd;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
+import org.eclipse.wst.sse.sieditor.ui.v2.dt.clipboard.ClipboardService;
+import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
+
+public class TreeViewerDragAdapter extends DragSourceAdapter {
+    private StructuredViewer viewer;
+
+    public TreeViewerDragAdapter(StructuredViewer viewer) {
+        this.viewer = viewer;
+    }
+
+    public void dragSetData(DragSourceEvent event) {
+        if (!SiEditorTransfer.getInstance().isSupportedType(event.dataType)) {
+            return;
+        }
+        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+        List<IModelObject> modelObjects = new ArrayList<IModelObject>();
+        for (Object selectedObject : selection.toArray()) {
+            if (selectedObject instanceof ITreeNode) {
+                modelObjects.add(((ITreeNode) selectedObject).getModelObject());
+            }
+        }
+        event.data = modelObjects.toArray();
+    }
+
+    public void dragStart(DragSourceEvent event) {
+        ISelection selection = viewer.getSelection();
+        if (selection instanceof IStructuredSelection) {
+            IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+            event.doit = ClipboardService.isCopyEnabled(structuredSelection.toArray());
+        } else {
+            event.doit = !selection.isEmpty();
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDropAdapter.java b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDropAdapter.java
index 6ec663e..cfc71dc 100644
--- a/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDropAdapter.java
+++ b/plugins/org.eclipse.wst.sse.sieditor.ui/api/org/eclipse/wst/sse/sieditor/ui/v2/dt/dnd/TreeViewerDropAdapter.java
@@ -3,7 +3,6 @@
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerDropAdapter;
 import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.wst.sse.sieditor.model.api.INamedObject;
 import org.eclipse.wst.sse.sieditor.model.impl.AbstractModelRoot;
 import org.eclipse.wst.sse.sieditor.ui.v2.AbstractFormPageController;
 import org.eclipse.wst.sse.sieditor.ui.v2.dt.DataTypesFormPageController;
@@ -20,7 +19,7 @@
 
     @Override
     public boolean performDrop(Object data) {
-        if (!(data instanceof INamedObject)) {
+        if (!(data instanceof Object[])) {
             return false;
         }
 
@@ -38,9 +37,8 @@
         }
 
         AbstractModelRoot modelRoot = (AbstractModelRoot) viewerInput;
-        INamedObject typeToBeCopied = (INamedObject) data;
 
-        ((DataTypesFormPageController) controller).handleDropTypeIntoEditor(modelRoot, typeToBeCopied, (ITreeNode) dropTarget);
+        ((DataTypesFormPageController) controller).handleDropTypeIntoEditor(modelRoot, (Object[]) data, (ITreeNode) dropTarget);
 
         return true;
     }
