diff --git a/deprecated/examples/org.eclipse.uml2.examples.ui/src/org/eclipse/uml2/examples/ui/actions/CreateExtensionAction.java b/deprecated/examples/org.eclipse.uml2.examples.ui/src/org/eclipse/uml2/examples/ui/actions/CreateExtensionAction.java
index 355a907..b87e808 100644
--- a/deprecated/examples/org.eclipse.uml2.examples.ui/src/org/eclipse/uml2/examples/ui/actions/CreateExtensionAction.java
+++ b/deprecated/examples/org.eclipse.uml2.examples.ui/src/org/eclipse/uml2/examples/ui/actions/CreateExtensionAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - Initial API and implementation
  *
- * $Id: CreateExtensionAction.java,v 1.2 2004/05/28 05:13:28 khussey Exp $
+ * $Id: CreateExtensionAction.java,v 1.3 2004/06/02 17:55:34 khussey Exp $
  */
 package org.eclipse.uml2.examples.ui.actions;
 
@@ -80,7 +80,7 @@
 					.getEClassifier(((org.eclipse.uml2.Class) referencedMetaclasses
 						.next()).getName());
 
-				if (!stereotype.getExtendedEClasses().contains(eClassifier)) {
+				if (!stereotype.getAllExtendedEClasses().contains(eClassifier)) {
 
 					choiceOfValues.add(eClassifier);
 				}
diff --git a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/Stereotype.java b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/Stereotype.java
index c9ae155..a165bea 100644
--- a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/Stereotype.java
+++ b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/Stereotype.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - Initial API and implementation
  *
- * $Id: Stereotype.java,v 1.4 2004/05/28 05:13:45 khussey Exp $
+ * $Id: Stereotype.java,v 1.5 2004/06/02 17:55:37 khussey Exp $
  */
 package org.eclipse.uml2;
 
@@ -50,12 +50,20 @@
 	public Extension createExtension(EClass eClass, boolean required);
 
 	/**
-	 * Retrieves the set of Ecore classes extended by this stereotype,
-	 * including the Ecore classes extended by its super(stereo)types.
+	 * Retrieves the set of Ecore classes extended by this stereotype, including
+	 * the Ecore classes extended by its super(stereo)types.
 	 * 
-	 * @return The Ecore classes extended by this stereotype.
+	 * @return The Ecore classes extended by this stereotype and its
+	 *         super(stereo)types.
 	 */
-	public Set getExtendedEClasses();
+	public Set getAllExtendedEClasses();
+
+	/**
+	 * Retrieves the metaclasses extended by this stereotype.
+	 * 
+	 * @return The metaclasses extended by this stereotype.
+	 */
+	public Set getExtendedMetaclasses();
 
 	/**
 	 * Retrieves the profile that owns this stereotype.
diff --git a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/impl/StereotypeImpl.java b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/impl/StereotypeImpl.java
index 6ba6895..50dd028 100644
--- a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/impl/StereotypeImpl.java
+++ b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/impl/StereotypeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - Initial API and implementation
  *
- * $Id: StereotypeImpl.java,v 1.15 2004/06/02 05:02:25 khussey Exp $
+ * $Id: StereotypeImpl.java,v 1.16 2004/06/02 17:55:37 khussey Exp $
  */
 package org.eclipse.uml2.impl;
 
@@ -720,21 +720,47 @@
 	 * 
 	 * @see org.eclipse.uml2.Stereotype#getExtendedEClasses()
 	 */
-	public Set getExtendedEClasses() {
+	public Set getAllExtendedEClasses() {
 
 		try {
-			Method method = getClass().getMethod("getExtendedEClasses", null); //$NON-NLS-1$
-			Set extendedEClasses = (Set) getCacheAdapter().get(this, method);
+			Method method = getClass().getMethod("getAllExtendedEClasses", null); //$NON-NLS-1$
+			Set allExtendedEClasses = (Set) getCacheAdapter().get(this, method);
 
-			if (null == extendedEClasses) {
-				extendedEClasses = StereotypeOperations
-					.getExtendedEClasses(this);
-				getCacheAdapter().put(this, method, extendedEClasses);
+			if (null == allExtendedEClasses) {
+				allExtendedEClasses = StereotypeOperations
+					.getAllExtendedEClasses(this);
+				getCacheAdapter().put(this, method, allExtendedEClasses);
 			}
 
-			return extendedEClasses;
+			return allExtendedEClasses;
 		} catch (Exception e) {
-			return StereotypeOperations.getExtendedEClasses(this);
+			return StereotypeOperations.getAllExtendedEClasses(this);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.uml2.Stereotype#getExtendedMetaclasses()
+	 */
+	public Set getExtendedMetaclasses() {
+
+		try {
+			Method method = getClass()
+				.getMethod("getExtendedMetaclasses", null); //$NON-NLS-1$
+			Set extendedMetaclasses = (Set) getCacheAdapter().get(eResource(),
+				this, method);
+
+			if (null == extendedMetaclasses) {
+				extendedMetaclasses = StereotypeOperations
+					.getExtendedMetaclasses(this);
+				getCacheAdapter().put(eResource(), this, method,
+					extendedMetaclasses);
+			}
+
+			return extendedMetaclasses;
+		} catch (Exception e) {
+			return StereotypeOperations.getExtendedMetaclasses(this);
 		}
 	}
 
diff --git a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/StereotypeOperations.java b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/StereotypeOperations.java
index a2a24b6..79b9f06 100644
--- a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/StereotypeOperations.java
+++ b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/StereotypeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - Initial API and implementation
  *
- * $Id: StereotypeOperations.java,v 1.7 2004/06/01 20:05:27 khussey Exp $
+ * $Id: StereotypeOperations.java,v 1.8 2004/06/02 17:55:37 khussey Exp $
  */
 package org.eclipse.uml2.internal.operation;
 
@@ -161,14 +161,15 @@
 	 * 
 	 * @param stereotype
 	 *            The stereotype for which to retrieve the Ecore classes.
-	 * @return The Ecore classes extended by the stereotype.
+	 * @return The Ecore classes extended by the stereotype and its
+	 *         super(stereo)types.
 	 */
-	public static Set getExtendedEClasses(Stereotype stereotype) {
-		Set extendedEClasses = new HashSet();
+	public static Set getAllExtendedEClasses(Stereotype stereotype) {
+		Set allExtendedEClasses = new HashSet();
 
-		getExtendedEClassesHelper(stereotype, extendedEClasses);
+		getAllExtendedEClassesHelper(stereotype, allExtendedEClasses);
 
-		return extendedEClasses;
+		return allExtendedEClasses;
 	}
 
 	/**
@@ -178,38 +179,32 @@
 	 * 
 	 * @param stereotype
 	 *            The stereotype for which to add the Ecore classes.
-	 * @param extendedEClasses
+	 * @param allExtendedEClasses
 	 *            The set to which to add the Ecore classes.
 	 */
-	protected static void getExtendedEClassesHelper(Stereotype stereotype,
-			Set extendedEClasses) {
+	protected static void getAllExtendedEClassesHelper(Stereotype stereotype,
+			Set allExtendedEClasses) {
 
-		ownedAttributesLoop : for (Iterator ownedAttributes = stereotype
-			.getOwnedAttributes().iterator(); ownedAttributes.hasNext();) {
+		extendedMetaclassesLoop : for (Iterator extendedMetaclasses = stereotype
+			.getExtendedMetaclasses().iterator(); extendedMetaclasses.hasNext();) {
 
-			Property property = (Property) ownedAttributes.next();
-			Type type = property.getType();
+			EClassifier eClassifier = UML2Package.eINSTANCE
+				.getEClassifier(((org.eclipse.uml2.Class) extendedMetaclasses
+					.next()).getName());
 
-			if (org.eclipse.uml2.Class.class.isInstance(type)
-				&& Extension.class.isInstance(property.getAssociation())) {
+			if (EClass.class.isInstance(eClassifier)) {
 
-				EClassifier eClassifier = UML2Package.eINSTANCE
-					.getEClassifier(type.getName());
+				for (Iterator eClasses = allExtendedEClasses.iterator(); eClasses
+					.hasNext();) {
 
-				if (EClass.class.isInstance(eClassifier)) {
+					EClass eClass = (EClass) eClasses.next();
 
-					for (Iterator eClasses = extendedEClasses.iterator(); eClasses
-						.hasNext();) {
-
-						EClass eClass = (EClass) eClasses.next();
-
-						if (((EClass) eClassifier).isSuperTypeOf(eClass)) {
-							continue ownedAttributesLoop;
-						}
+					if (((EClass) eClassifier).isSuperTypeOf(eClass)) {
+						continue extendedMetaclassesLoop;
 					}
-
-					extendedEClasses.add(eClassifier);
 				}
+
+				allExtendedEClasses.add(eClassifier);
 			}
 		}
 
@@ -220,13 +215,42 @@
 				.getGeneral();
 
 			if (Stereotype.class.isInstance(general)) {
-				getExtendedEClassesHelper((Stereotype) general,
-					extendedEClasses);
+				getAllExtendedEClassesHelper((Stereotype) general,
+					allExtendedEClasses);
 			}
 		}
 	}
 
 	/**
+	 * Retrieves the metaclasses extended by the specified stereotype.
+	 * 
+	 * @param stereotype
+	 *            The stereotype for which to retrieve the metaclasses.
+	 * @return The metaclasses extended by the stereotype.
+	 */
+	public static Set getExtendedMetaclasses(Stereotype stereotype) {
+		Set extendedMetaclasses = new HashSet();
+
+		if (null != stereotype) {
+
+			for (Iterator ownedAttributes = stereotype.getOwnedAttributes()
+				.iterator(); ownedAttributes.hasNext();) {
+
+				Property property = (Property) ownedAttributes.next();
+				Type type = property.getType();
+
+				if (org.eclipse.uml2.Class.class.isInstance(type)
+					&& Extension.class.isInstance(property.getAssociation())) {
+
+					extendedMetaclasses.add(type);
+				}
+			}
+		}
+
+		return extendedMetaclasses;
+	}
+
+	/**
 	 * Applies the specified stereotype to the specified element.
 	 * 
 	 * @param stereotype
@@ -285,7 +309,7 @@
 			throw new IllegalArgumentException(String.valueOf(eClass));
 		}
 
-		for (Iterator extendedEClasses = stereotype.getExtendedEClasses()
+		for (Iterator extendedEClasses = stereotype.getAllExtendedEClasses()
 			.iterator(); extendedEClasses.hasNext();) {
 
 			if (eClass.isSuperTypeOf((EClass) extendedEClasses.next())) {
@@ -387,7 +411,7 @@
 					&& null != getEClass(stereotype, appliedVersion)) {
 
 					for (Iterator extendedEClasses = stereotype
-						.getExtendedEClasses().iterator(); extendedEClasses
+						.getAllExtendedEClasses().iterator(); extendedEClasses
 						.hasNext();) {
 
 						if (((EClass) extendedEClasses.next())
