[464427] Improving performance of Namespace::importMembers(...).
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java
index f41d972..a2c635e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,11 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey - 323181
- *   Kenn Hussey (CEA) - 327039, 418466, 451350, 459651, 433768
+ *   Kenn Hussey (CEA) - 327039, 418466, 451350, 459651, 433768, 464427
  *
  */
 package org.eclipse.uml2.uml.internal.operations;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -21,7 +22,7 @@
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.UniqueEList;
-
+import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.uml2.common.util.UnionEObjectEList;
@@ -494,19 +495,60 @@
 		EList<PackageableElement> importMembers = new UniqueEList.FastCompare<PackageableElement>();
 		EList<NamedElement> ownedMembers = namespace.getOwnedMembers();
 
-		excludeCollisionsLoop : for (PackageableElement excludeCollision : namespace
-			.excludeCollisions(imps)) {
+		Map<String, EList<NamedElement>> memberNames = new HashMap<String, EList<NamedElement>>();
 
-			for (NamedElement ownedMember : ownedMembers) {
+		for (NamedElement ownedMember : ownedMembers) {
 
-				if (!excludeCollision.isDistinguishableFrom(ownedMember,
-					namespace)) {
+			for (String name : namespace.getNamesOfMember(ownedMember)) {
+				EList<NamedElement> members = memberNames.get(name);
 
-					continue excludeCollisionsLoop;
+				if (members == null) {
+					memberNames.put(name,
+						members = new UniqueEList.FastCompare<NamedElement>());
+				}
+
+				members.add(ownedMember);
+			}
+		}
+
+		for (PackageableElement imp : imps) {
+
+			for (String name : namespace.getNamesOfMember(imp)) {
+				EList<NamedElement> members = memberNames.get(name);
+
+				if (members == null) {
+					memberNames.put(name,
+						members = new UniqueEList.FastCompare<NamedElement>());
+				}
+
+				members.add(imp);
+			}
+		}
+
+		impsLoop : for (PackageableElement imp : imps) {
+			EClass impEClass = imp.eClass();
+
+			for (String name : namespace.getNamesOfMember(imp)) {
+				EList<NamedElement> members = memberNames.get(name);
+
+				if (members.size() > 1) {
+
+					for (NamedElement member : members) {
+
+						if (member != imp) {
+							EClass memberEClass = member.eClass();
+
+							if (memberEClass.isSuperTypeOf(impEClass)
+								|| impEClass.isSuperTypeOf(memberEClass)) {
+
+								continue impsLoop;
+							}
+						}
+					}
 				}
 			}
 
-			importMembers.add(excludeCollision);
+			importMembers.add(imp);
 		}
 
 		return ECollections.unmodifiableEList(importMembers);
@@ -527,18 +569,46 @@
 			Namespace namespace, EList<PackageableElement> imps) {
 		EList<PackageableElement> excludeCollisions = new UniqueEList.FastCompare<PackageableElement>();
 
-		imps1Loop : for (PackageableElement imp1 : imps) {
+		Map<String, EList<NamedElement>> memberNames = new HashMap<String, EList<NamedElement>>();
 
-			for (PackageableElement imp2 : imps) {
+		for (PackageableElement imp : imps) {
 
-				if (imp1 != imp2
-					&& !imp1.isDistinguishableFrom(imp2, namespace)) {
+			for (String name : namespace.getNamesOfMember(imp)) {
+				EList<NamedElement> members = memberNames.get(name);
 
-					continue imps1Loop;
+				if (members == null) {
+					memberNames.put(name,
+						members = new UniqueEList.FastCompare<NamedElement>());
+				}
+
+				members.add(imp);
+			}
+		}
+
+		impsLoop : for (PackageableElement imp : imps) {
+			EClass impEClass = imp.eClass();
+
+			for (String name : namespace.getNamesOfMember(imp)) {
+				EList<NamedElement> members = memberNames.get(name);
+
+				if (members.size() > 1) {
+
+					for (NamedElement member : members) {
+
+						if (member != imp) {
+							EClass memberEClass = member.eClass();
+
+							if (memberEClass.isSuperTypeOf(impEClass)
+								|| impEClass.isSuperTypeOf(memberEClass)) {
+
+								continue impsLoop;
+							}
+						}
+					}
 				}
 			}
 
-			excludeCollisions.add(imp1);
+			excludeCollisions.add(imp);
 		}
 
 		return ECollections.unmodifiableEList(excludeCollisions);