[495564] Improving performance of NamedElement::getNamespace().
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java
index 045f43b..eb9bdc7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java
@@ -7,11 +7,12 @@
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey (CEA) - 327039, 351774, 374878, 418466, 433211, 451350, 485756
+ *   Kenn Hussey (CEA) - 327039, 351774, 374878, 418466, 433211, 451350, 485756, 495564
  *
  */
 package org.eclipse.uml2.uml.internal.operations;
 
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -379,6 +380,9 @@
 		return true;
 	}
 
+	protected static final List<EStructuralFeature> NAMESPACE__MEMBER__ALL_SUBSETS = getAllSubsetFeatures(
+		UMLPackage.Literals.NAMESPACE__MEMBER);
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -388,15 +392,11 @@
 		InternalEObject eInternalContainer = ((InternalEObject) namedElement)
 			.eInternalContainer();
 
-		if (eInternalContainer instanceof Namespace) {
-			Namespace namespace = (Namespace) eInternalContainer;
-
-			if (namespace.getMembers().contains(namedElement)) {
-				return namespace;
-			}
-		}
-
-		return null;
+		return eInternalContainer instanceof Namespace
+			&& NAMESPACE__MEMBER__ALL_SUBSETS
+				.contains(namedElement.eContainingFeature())
+					? (Namespace) eInternalContainer
+					: null;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
index 4db5369..bf3d401 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
@@ -10,7 +10,7 @@
  *   Kenn Hussey (Embarcadero Technologies) - 199624, 184249, 204406, 208125, 204200, 213218, 213903, 220669, 208016, 226396, 271470
  *   Nicolas Rouquette (JPL) - 260120, 313837
  *   Kenn Hussey - 286329, 313601, 314971, 344907, 236184, 335125
- *   Kenn Hussey (CEA) - 327039, 358792, 364419, 366350, 307343, 382637, 273949, 389542, 389495, 316165, 392833, 399544, 322715, 163556, 212765, 397324, 204658, 408612, 411731, 269598, 422000, 416833, 424568, 427167, 418466, 419324, 429994, 433157, 439915, 446388, 454864, 458906, 461374, 463066, 468230, 481712, 491587
+ *   Kenn Hussey (CEA) - 327039, 358792, 364419, 366350, 307343, 382637, 273949, 389542, 389495, 316165, 392833, 399544, 322715, 163556, 212765, 397324, 204658, 408612, 411731, 269598, 422000, 416833, 424568, 427167, 418466, 419324, 429994, 433157, 439915, 446388, 454864, 458906, 461374, 463066, 468230, 481712, 491587, 495564
  *   Yann Tanguy (CEA) - 350402
  *   Christian W. Damus (CEA) - 392833, 251963, 405061, 409396, 176998, 180744, 403374, 416833, 420338, 405065, 431342
  *   E.D.Willink - 420338
@@ -13341,4 +13341,55 @@
 		return body;
 	}
 
+	protected static boolean isSubset(EStructuralFeature feature,
+			EStructuralFeature supersetFeature, boolean recurse) {
+		EAnnotation subsetsAnnotation = feature
+			.getEAnnotation(ANNOTATION__SUBSETS);
+
+		if (null != subsetsAnnotation) {
+
+			for (EObject reference : subsetsAnnotation.getReferences()) {
+
+				if (reference == supersetFeature
+					|| recurse && isSubset((EStructuralFeature) reference,
+						supersetFeature, recurse)) {
+
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	protected static List<EStructuralFeature> getAllSubsetFeatures(
+			EStructuralFeature supersetFeature) {
+		List<EStructuralFeature> allSubsetFeatures = new UniqueEList.FastCompare<EStructuralFeature>();
+
+		EClass eContainingClass = supersetFeature.getEContainingClass();
+
+		for (EClassifier eClassifier : eContainingClass.getEPackage()
+			.getEClassifiers()) {
+
+			if (eClassifier instanceof EClass) {
+				EClass eClass = (EClass) eClassifier;
+
+				if (eContainingClass.isSuperTypeOf(eClass)) {
+
+					for (EStructuralFeature eStructuralFeature : eClass
+						.getEStructuralFeatures()) {
+
+						if (isSubset(eStructuralFeature, supersetFeature,
+							true)) {
+
+							allSubsetFeatures.add(eStructuralFeature);
+						}
+					}
+				}
+			}
+		}
+
+		return allSubsetFeatures;
+	}
+
 }